【DP】 会长晨刷记

 

问题 B: 会长晨刷记

时间限制: 1 Sec  内存限制: 128 MB
提交: 105  解决: 36
[提交][状态][讨论版]

题目描述

晨刷是个好活动!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
//dp[n]=dp[n-1]+dp[n-2]+dp[n-3]+dp[n-4]
//两个wa点
//1、给你的水池不一定排好序
//2、要是终点处有水池,方案数为0
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int maxx=1005;
int a[maxx];
int dp[maxx];
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        map <int,int> M;
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&a[i]);
            M[a[i]]=1;
        }
        sort(a+1,a+m+1);
        if(a[m]==n) {printf("0\n");continue;}
        dp[0]=1;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=4; j++)
            {
                int p=0;
                if(i-j<0) continue;
                if(M[i-j]==1) continue;
                dp[i]=(dp[i]+dp[i-j])%20152016;
            }
        }
        printf("%d\n",dp[n]);
    }
    return 0;
}

 

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页