小Z爬华山

文章描述了一个关于计算在华山攀登过程中避开陷阱台阶的方案数的问题。给定总台阶数n和陷阱台阶数m,小z需使用一步跨1、2或3个台阶的方式到达山顶,利用动态规划求解方案数,并对结果进行模运算。如果无法到达山顶,则输出-1。提供的AC代码实现了这一算法。
摘要由CSDN通过智能技术生成
题目描述

自古华山一条路,华山一直是小 z 向往的地方。我们知道,华山共有 n 个台阶,小 z 一步可以跨 1 个、2 个或者 3 个台阶,请你输出小 z 最终爬到山顶的方案数。小 z 想,非 常简单,直接递推即可,但是小 y 突然走到小 z 面前,得意的说:“小 z,我在 m 个台阶上 分别放了陷阱,这些台阶是不能踏上去的,请你输出方案数”。由于方案数会很大,所以答 案需要模 100003。聪明的小 z 怎么会被难倒,他自然知道做法,但是他把问题交给了你, 因为他要去处理损友小 y。若无法走到,则输出-1。

输入格式

一行两个数 n 和 m,空格隔开。接下来的1行,共m个数字,表示放置陷阱的台阶位置。m< n <1000。

输出格式

每组测试数据的方案数 。

样例

input

5 1 
4 

output*

6

AC代码:

 #include<bits/stdc++.h>
 using namespace std;
 int f[1005];
 bool b[1005];
 int main(){
 	int m,n,x,mod=100003;
 	cin>>n>>m;
 	for(int i=0;i<=m;i++){
 		cin>>x;
 		b[x]=1;
	 }
	 f[0]=1;
	 for(int i=1;i<=n;i++)
	 	if(!b[i])
	 	for(int j=max(0,i-3);j<i;j++)
	 	f[i]=(f[i]+f[j])%mod;
	 	if(f[n]==0) f[n]=-1;
	 cout<<f[n]<<endl;
 	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值