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

本文探讨了一个行走路径计数问题,通过递推方法解决,详细解释了每一步的状态转移,提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: [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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值