[HDU 2563]统计问题[递推]

来源:互联网 发布:淘宝如何用图片搜同款 编辑:程序博客网 时间:2024/04/29 14:21
题目链接:[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;}


0 0
原创粉丝点击