脑力激活B 简单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;
}


阅读更多
个人分类: DP
想对作者说点什么? 我来说一句

brain3.95成人脑力训练破解版

2012年11月10日 8.69MB 下载

阿达成人脑力训练v3.08破解文件

2007年12月03日 175KB 下载

世界脑力锦标赛训练软件

2014年09月17日 5.66MB 下载

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

不良信息举报

脑力激活B 简单DP

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭