文章标题 HDU 1176:免费馅饼 (DP)

来源:互联网 发布:城市智能交通大数据 编辑:程序博客网 时间:2024/04/25 08:01

免费馅饼

题意:就是在0~10的坐标上,每一秒都有馅饼掉在这上面,然后,现在有一个人在5的位置上,每次他只能移动一个,比如他在5 位置,下一秒他可以跑到4 5 6其中一个上面,现在就是要求当馅饼掉完之后,他最多能接到多少馅饼。
分析:这是一道动态规划的问题,定义dp[i,j]表示为在第i秒时在j位置最多能那到的馅饼的数量。输入时用一个数组num[i,j]保存第i秒在j 位置上馅饼的数量,所以就可以得到状态转移方程
dp[i][j]=max(dp[i-1][j]+num[i][j], dp[i-1][j-1]+num[i][j], dp[i-1][j+1]+num[i][j])
代码:

#include<iostream>#include<string>#include<cstdio>#include<cstring>#include<vector>#include<math.h>#include<queue> #include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int n;node a[100005];int num[100005][11]; int dp[100005][11];int main (){    while (scanf ("%d",&n)&&n){        memset (num,0,sizeof (num));        memset (dp,0,sizeof (dp));        int maxt=0;        for (int i=0;i<n;i++){            int x,y;            scanf ("%d%d",&x,&y);            num[y][x]++;            maxt=max(y,maxt);//记录最大的时间        }        dp[1][4]=num[1][4];//初始化        dp[1][5]=num[1][5];        dp[1][6]=num[1][6];        for (int i=2;i<=maxt;i++){            for (int j=0;j<=10;j++){                if (j==0){//当j为0时,只能由0 或1转移而来                    dp[i][j]=max(dp[i-1][j]+num[i][0],dp[i-1][j+1]+num[i][0]);                }                else if (j==10){//当j为10时,只能由9 10转移而来                    dp[i][j]=max(dp[i-1][j]+num[i][10],dp[i-1][j-1]+num[i][10]);                }                else {                    dp[i][j]=max(dp[i-1][j-1]+num[i][j],dp[i-1][j]+num[i][j]);                    dp[i][j]=max(dp[i][j],dp[i-1][j+1]+num[i][j]);                }            }         }        int ans=0;        for (int i=0;i<=10;i++){//找出最大值            ans=max(dp[maxt][i],ans);        }        printf ("%d\n",ans);    }           return 0;}
0 0