跳石子(动态规划)

题目描述
数轴上有n块石头,每块石头的坐标为i。
WYM想从第1块石头跳到第n块石头上。他每次跳跃的最大距离为3。也就是说他每次可以跳1格,也可以跳2格,也可以跳3格。
但是有些石头是坏的,所以他不能到这些位置。
你能知道WYM有多少种方案,从第1块石头跳到第n块石头上吗?

输入格式
输入分为两行。
第一行两个正整数n和m。分别表示终点所在的位置,和坏石头的数目。
第二行m个正整数,每个数字a[i]代表坏石头的位置。
0 < n <= 10000; 0 < m <= 100

输出格式
输出方案数量。如果数字过大,请对10007取余。

样例输入
5 1
3

样例输出
3

提示
三种方案分别为:
1 2 4 5
1 2 5
1 4 5

#include<iostream>
using namespace std;
int dp[10005];
bool b[10005];
int main(){
    
    
	int n,m,t;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
    
    
		cin>>t;
		b[t]=true;
	}
	if(!b[1])	dp[1]=1;
	if(!b[2])	dp[2]=dp[1];
	if(!b[3])	dp[3]=dp[1]+dp[2];
	for(int i=4;i<=n;i++)
		if(!b[i])
			dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%10007;
	cout<<dp[n];
}

猜你喜欢

转载自blog.csdn.net/m0_51794965/article/details/111504142