题目描述
数轴上有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];
}