hdu1176 免费馅饼(dp)

来源:互联网 发布:苹果6无法加入网络 编辑:程序博客网 时间:2024/04/28 11:53

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1176

题目大意:中文题。

思路:对于这么一个问题,考虑dp。

可以令dp[i][j]为第i秒在j位置上获得的最大馅饼数量。

这样就可以写出状态转移方程:

dp[i][j]=max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]))+a[i][j];

就是对于前一秒在3个位置的判断,找出最大的。

#include<stdio.h>#include<string.h>int max(int a,int b){    if(a>b)return a;    else return b;}int dp[100005][12],a[100005][12];int main(){    int n,x,T,i,j,k,maxi;    while(scanf("%d",&n)!=EOF)    {        maxi=0;        if(n==0)break;        memset(dp,0,sizeof(dp));        memset(a,0,sizeof(a));        for(i=1;i<=n;i++)        {            scanf("%d%d",&x,&T);            a[T][x]++;            maxi=max(maxi,T);   //找到最长的时间        }            for(i=1;i<=maxi;i++)        {            j=5-i;     //因为刚开始是在5的位置,所以刚开始能涉及的范围比较小。            if(j<0)j=0;            int ed=5+i;            if(ed>10)ed=10;            for(;j<=ed;j++)            {                if(j>0&&j<10)                dp[i][j]=max(dp[i-1][j],max(dp[i-1][j-1],dp[i-1][j+1]))+a[i][j];                else if(j==0)dp[i][j]=max(dp[i-1][j],dp[i-1][j+1])+a[i][j];                else if(j==10)dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];                          }                }        int ma=0;        for(i=0;i<=10;i++)        {            ma=max(ma,dp[maxi][i]);}    //找到最后某个位置上的最大值        printf("%d\n",ma);    }    return 0;}



0 0