题目链接:
[HDU 2563]统计问题[递推]
题意分析:
走过的地面马上就会坍陷无法再走,初始时,有一个方向无法行走,这里设为下方。问,走n步,一共有多少种走法?
解题思路:
如果上一步是向上,那么这步就可以走上,左,右;如果上一步是向左或者向右,那么这一步就可以向上或者向着上一步相同的方向。总共就这两种情况。
我们设向上走为z[i],左右走为h[i],总共走法为f[i]。
由于不过是上面哪两种情况,都可以向上走,所以有z[i] = f[i - 1];
如果上一步向上走,那么这一步横着走就可以往左右两个方向之一走;如果上一步是横着走的,那么这一步横着走只能沿着原有方向走了。
所以有:h[i] = 2 * z[i - 1] + h[i - 1];
最终:f[i] = z[i] + h[i];
个人感受:
之前画了个图找规律,死活WA,原来少考虑了好多东西。比如行走的方向会对后继状态影响。这题递推感觉很赞。
具体代码如下:
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
using namespace std;
const int INF = 0x7f7f7f7f;
const int MAXN = 111;
int f[MAXN], h[MAXN], z[MAXN];
int main()
{
int c, n; cin >> c;
f[1] = 3;
h[1] = 2;
z[1] = 1;
for (int i = 2; i <= 22; ++i) {
z[i] = f[i - 1];
h[i] = 2 * z[i - 1] + h[i - 1];
f[i] = z[i] + h[i];
}
while (c --) {
cin >> n;
cout << f[n] << '\n';
}
return 0;
}