前言:
这篇文章还是是为了帮助一些
像我这样的菜鸟
找到简单的题解
上了很久的csp复习课
我发现我动态规划的题解少之又少
这几期我来更新一下动规的题
问题描述:
小q现在在买饲料的路上,到达卖饲料的地方后小q还需要再上n级台阶。
小q的步子可以很大,每次小q可以上1或2或3级台阶。
由于今天下雨了,有一些台阶上有积水。
但是小q穿的今天新买的AJ,为此他不想新鞋踩到水上,所以他不愿意走到有积水的台阶上。
小q现在想知道:在不走到有积水的台阶上的情况下,走到第n级台阶有多少种不同的走法。
由于答案可能很大,你只需要输出不同的走法数量对10007取模。
输入格式
第一个整数n,表示台阶数量。
接下来n个数,第i个数为0表示第i级台阶有积水,第i个数为1表示第i级台阶没有积水。
数据保证第n级台阶上一定没有积水(不必验证)。
输出格式
输出一个数,表示不同的走法数量对10007取模的结果。
如果小q无法在不走到积水的台阶的条件下走到第n级台阶,则输出0。
样例输入
3
1 1 1
样例输出
4
问题提示
对于60%的数据,n≤1000。
对于100%的数据,n≤100000。
问题解析:
看到到这道题我想笑
应该改题目名叫《关于小q穿AJ吃饲料这件事》
回归正题
本题看着很难实际上(更难)只需两个数组判断在到达水坑时
continue即可
转换方程还为:
f[i]=f[i-1]+f[i-2]+f[i-3];
只需在上题加一个水坑判断
动态规划 台阶问题二(爱思创)_吾乃狙击神蛐的博客-CSDN博客
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int mod=1e4+7;//取模
int f[N],a[N];
int main()
{
int n,i;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
f[0]=1;
if(a[1]==1) f[1]=1;//判断是否为水坑
if(a[2]==1) f[2]=f[1]+f[0];//必须这样写台阶一不一定是不是水坑
for(int i=3;i<=n;i++)
{
if(a[i]==1) f[i]=((f[i-1]+f[i-2])%mod+f[i-3])%mod;//转换方程
}
cout<<f[n];//输出结果
return 0;
}