Jerry 跑到了二楼,现在Tom面临的是一个n阶的楼梯,由于Tom的腿比较短,因此它一次只能爬1阶或2阶,机智的Jerry破坏掉了m阶楼梯,也就是说Tom无法踩在这m阶楼梯上,现在Tom想知道他有多少种方案能爬到第n阶楼梯。由于答案很大,输出方案数对109+7取模的结果。
输入格式
第一行输入一个T代表有T组输入,对于每组输入:
第一行输入n,m,第二行输入m个数,第i个数ai代表第ai阶楼梯被破坏了。
(1≤T,m≤10,1≤n≤1000,1≤ai≤n)。
输出格式
对于每组输入,输出方案数对109+7取模的结果。
input
3
1 1
1
8 1
1
10 2
1 2
output
0
13
0
解题思路
一道dp题,要注意先想明白直接代码吧
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
typedef long long ll;
int dp[maxn];
const int mod=1e9+7;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d %d",&n,&m);
dp[1]=1;
dp[2]=2;//赋初值
for(int i=3;i<=n;i++)
dp[i]=1;
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
if(x==1) dp[1]=0,dp[2]=1;
else if(x==2) dp[2]=0;
else dp[x]=0;//这一点要想想
}
for(int i=3;i<=n;i++)
{
if(dp[i]) dp[i]=(dp[i-1]%mod+dp[i-2]%mod)%mod;//破坏的就不算了
}
printf("%d\n",dp[n]);
}
return 0;
}