1196踩方格—递推方法!

经历过一次又一次寻找递推式的失败,终于成功用递推写出来了。
很开心,手动滑稽,手动狗头
题目:

1196:踩方格

时间限制: 1000 ms内存限制: 65536 KB
提交数: 2857通过数: 1893
【题目描述】
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a、每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b、走过的格子立即塌陷无法再走第二次;
c、只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
【输入】
允许在方格上行走的步数n(n≤20)。
【输出】
计算出的方案数量。
【输入样例】

2

【输出样例】
7

【来源】

No
提交 统计信息

关于这道题所用的递推式不要着急往下翻,来跟我一起里思路。
当只能走一步的时候,有三种走法,即:左、前、右。(顺序很重要)
当走两步的时候,分类讨论:
1、第一步往左走:只能往左和往前
2、第一步往前走:可以走三个方向
3、低一步往右走:只能往右或者往前
所以共有7种走法。
我们发现:往左走的方法数和往右走的方法数是一样的,只有往前走的方法数不一样(多一种)
/*下面说的向左走:现在面临着2种选择向前走:现在面临着3种选择*/
当我们把向左走与向右走统一合并为向左走之后,变为:
当n=1时:向左走=1,向前走=1,方法数:向左走*2+向前走(刚开始要么是往左(2种),要么是往前(3种))
当n=2时,向左走=3,向前走=1,方法数:向左走*2+向前走
当n=3时(自己推,并不复杂),向左走=7,向前走=3 方法数:向左走*2+向前走
归纳:
n=n+1时,向左走=n的时候向左走*2+n的时候向前走,向前走=n的时候的向左走。
所以代码:

#include using namespace std; const int maxn=1e5+100; int a[maxn]; int main() { int n,i,m; cin>>n; long ans1=1; long ans2=1; long a=0; for(i=2; i<=n; i++) { a=ans2; ans2=ans1+ans2*2; ans1=a; } cout<





























































































































【1196踩方格—递推方法!】

    推荐阅读