hdu 1176 免费馅饼

来源:互联网 发布:新浪财经数据库 编辑:程序博客网 时间:2024/06/05 16:26

这题的题意是: 给出11个点,然后给出 位置和时间 的Pair序列代表每个时刻每个点会掉落一个馅饼(可重复).注意这里并没有说时间是有序的..所以用一个二维数组对馅饼的掉落时间和掉落位置进行存储.
移动策略 : dp[i][j] = max(dp[i+1][j+1],dp[i][j+1],dp[i-1][j+1]) + a[i][j]; 其中a[i][j]代表对应时刻和位置的馅饼数量.j代表时间,i代表位置.
这里我从T+1时刻开始计算,这样最后取得dp[5][0]即可..若正面向下,则需要比较一下最底层的所有馅饼数才能获得最大值.由于点0和点10比较特殊.故我在这里在其位置都加1,取消这两个端点的特殊性.

#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int MAXN = 1e5 + 5;const int SIZE = 15;int a[SIZE][MAXN],dp[SIZE][MAXN];int N,T;int max(int a,int b,int c);int main(){//    freopen("1176.txt","r",stdin);    while(~scanf("%d",&N),N)    {        int p,t;        memset(dp,0,sizeof(dp));        memset(a,0,sizeof(a));        for(int i = 0; i < N; i++)        {            scanf("%d%d",&p,&t);            a[p+1][t] ++;            T = T > t ? T : t;        }        for(int j = T; j >= 0 ; j--)        {             for(int i = 1; i <= 12; i++)                {                    dp[i][j] = max(dp[i-1][j+1],dp[i][j+1],dp[i+1][j+1]) + a[i][j];//                    printf("dp[%d][%d]: %d ",i,j,dp[i][j]);                }//                puts("");        }        printf("%d\n",dp[6][0]);    }    return 0;}int max(int a,int b,int c){    a = a > b ? a : b;    return a > c ? a : c;}
0 0
原创粉丝点击