「一本通入门 2.3」 踩方格(典型的递推题目,值得一看)

2024-02-22 02:44

本文主要是介绍「一本通入门 2.3」 踩方格(典型的递推题目,值得一看),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目描述】

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:

a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;

b、走过的格子立即塌陷无法再走第二次;

c、只能向北、东、西三个方向走;

请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

【输入】

允许在方格上行走的步数n(n≤20)。

【输出】

计算出的方案数量。

【输入样例】

2

【输出样例】

7

 乍一看,是不是完全没有思路?没事,我们慢慢来理

错误一:方格中走到(i,j)位置的方案数等于走 到方格中(i,j-1),(i,j+1),(i-1,j)的方案 数之和。  

f[i][j]=f[i-1][j]+f[i][j-1]+f[i][j+1];                                                                 按照递推的规则,比如我们按照行列都从1开始推 ,在我们求f[i][j]位置的方案数之前,我们只知道f[i-1][j]和 f[i][j-1]的方案数,而不知道f[i][j+1]的方案数。

错误二: f[i][j]=f[i-1][j]+f[i][j-1]+f[i][j+1];

陷阱:只能向左,上,右移动,并且移动过的方格马上 就会塌陷, 当上一步到达(i.j-1)的时候,他 可以从(i,j)过来,即从右边过来, 但是如果他从右边过来,那么下一 步就不能再往左边走了,因为该方 格已经塌陷了。即并不是走到 (i,j-1),(i,j+1)的方案都可以走 到走到(i,j).所以递推公式错误 

所以

我们分情况讨论: 设走k步,最后一次向右走的方案数为r[k]; 设走k步,最后一次向左走的方案数为l[k]; 设走k步,最后一次向上走的方案数为t[k]; 我们可以得到递推公式为: r[k]=t[k-1]+r[k-1];//上一步不可以向左走到达 l[k]=t[k-1]+l[k-1];//上一步不可以向右走到达 t[k]=t[k-1]+r[k-1]+l[k-1];//所有方案都可以

初始化: r[1]=1; l[1]=1; t[1]=1;

最终:f[k]=r[k]+l[k]+t[k];

我们可以把上面的等式化简:

r[k]=t[k-1]+r[k-1];//上一步不可以向左走到达

l[k]=t[k-1]+l[k-1];//上一步不可以向右走到达

t[k]=t[k-1]+r[k-1]+l[k-1];//所有方案都可以

r[k]+l[k]+t[k]=2*(t[k-1]+r[k-1]+t[k-1])+t[k-1];

f[k]=2*f[k-1]+t[k-1];

t[k-1]=t[k-2]+r[k-2]+l[k-2]=f[k-2];

最终得到:f[k]=2*f[k-1]+f[k-2]

初始值:f[0]=1; f[1]=3;

其实把上文说人话就是当第i-1步走到表格中黄色的区域的 位置的时候,方案数为f[i-1]; 第一种情况:无论是从哪个方向到 达该位置,如果下一次(第i步)向上 (北)走,那么走i步的方案数是f[i-1] 第二种情况:如果上一次是从下方(红 色)往上(北)走到达黄色位置,说明下一 步(第k步)左边和右边都可以走,往上走 的情况,第一种情况已经考虑了就不在 重复计算了,方案数是f[i-2]*2. 第三种情况,如果上一次是从 左边或者右边(绿色)到达黄色 方格,说明下一次只可以往右 或者左走(方向不变,向上已经考虑了。),到达黄色 方格的所有方案数是f[i-1],再减去从下方到达黄色 方格的方案数f[i-2],即f[i-1] - f[i-2]

听懂了吗?没听懂再看一遍,一遍不行就两遍,我就不信你看不懂。

ACcode 

#include<bits/stdc++.h>
using namespace std;
int f[25]={1,3,7};
int main(){int n;cin>>n;if (n==1||n==2){cout<<f[n];return 0;}for(int i=3;i<=n;i++){f[i]=f[i-1]*2+f[i-2];}cout<<f[n]<<endl;return 0;}

看了这么久,作者也写了这么久,能不能点一个赞,在收藏一下呢?最好的话在点个关注吧

谢谢啦!

这篇关于「一本通入门 2.3」 踩方格(典型的递推题目,值得一看)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/733904

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

poj2505(典型博弈)

题意:n = 1,输入一个k,每一次n可以乘以[2,9]中的任何一个数字,两个玩家轮流操作,谁先使得n >= k就胜出 这道题目感觉还不错,自己做了好久都没做出来,然后看了解题才理解的。 解题思路:能进入必败态的状态时必胜态,只能到达胜态的状态为必败态,当n >= K是必败态,[ceil(k/9.0),k-1]是必胜态, [ceil(ceil(k/9.0)/2.0),ceil(k/9.

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就