动态规划 台阶问题三(爱思创)

前言:

这篇文章还是是为了帮助一些

像我这样的菜鸟

找到简单的题解

上了很久的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;
}

AC

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值