题目描述
晨刷是个好活动!ACM会长路明非特别热衷于晨刷,尤其是路程变长时间变短了之后。
可是最近天天下雨,晨刷的路上有各种水坑,踩到水坑就会弄湿美美的鞋子和裤子,
因此会长很烦恼:还让不让人愉快的晨刷了?!
于是会长想知道自己该如何巧妙避开各种水坑。
假设从起点到终点有n米,其中有m个水坑是需要避开的,会长每次可以走1米2米3米或者4米。
请问在这种情况下,会长有多少种方式避开水坑到达终点。
输入
输入包含多组输入,每组测试数据第一行两个整数n,m(n,m<=1000),第二行m个整数,a[1],a[2],a[3],a[4].....a[m],表示水坑的位置(即在 a[i] (1<=i<=m) 米处有水坑)
输出
输出避开水坑到达终点的方法数。由于答案会很大,输出答案对 20152016 取模
样例输入
4 2
1 3
样例输出
2
这道题就是比较简单的dp题,只要注意终点可能是水坑就ok
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1010;
int a[MAXN], dp[MAXN];
int main(){
int n ,m ;
while(cin >> n >> m)
{
memset(dp, 0 , sizeof(dp));
for(int i = 1 ; i <= m ; i ++)
{
cin >> a[i];
dp[a[i]] = -1;
}
dp[0] = 1;
if(dp[n] == -1)
{
cout << 0 << endl;
continue;
}
else
{
for(int i = 1; i <= n ;i ++)
{
if(dp[i] == -1)
continue;
for(int j = i - 1; j >= i - 4 && j >= 0;j -- )
{
if(dp[j] == -1)
continue;
dp[i] += dp[j];
dp[i] %= 20152016;
}
}
dp[n] %= 20152016;
cout << dp[n] << endl;
}
}
return 0;
}