hdu 1176:免费馅饼

hdu1176: http://poj.org/problem?id=1179
题意:有一一维坐标系,从0编号到10,一个人站在5上,现在天上正在掉馅饼,这个人每秒只能移动一个单位,所以第一秒只能接住掉在4、5、6上的馅饼,现给出某个点在某个时间 点有馅饼,问最多能接到多少馅饼 解法:dp:dp[i][j]表示直到第j秒站在i上接到的最多馅饼数,则有转移方程:dp[i][j]=v[i][j]+max(dp[i-1][j-1],dp[i][j-1],dp[i+1][j-1])。
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int inf = 1 << 29;
#define MAX 100050
int dp[13][MAX],v[13][MAX], n;
int max(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}
int main()
{
     while(1)
     {
        scanf("%d",&n);
        if(n==0)break;
        int T = 0, x, t;
        memset(dp, 0, sizeof(dp));
        memset(v,0,sizeof(v));
        for(int i = 0; i < 13; i++)
        {
            dp[i][0] = -inf;       //也可不用v,直接用dp代替
            v[i][0]=-inf;
        }
        dp[6][0] = 0;         //初始状态为0
        for(int i = 0; i < n; i++)
        {
             scanf("%d%d", &x, &t);
             v[x+1][t]++;            //此处用到一点技巧,将坐标系往右移一位,则后面的j-1不会出现为负数
             T = max(T, t);
         }
         for(int i = 1; i <= T; i++)
             for(int j = 1; j <= 11; j++)
                 dp[j][i]=v[j][i]+max(dp[j-1][i-1], max(dp[j][i-1], dp[j+1][i-1]));
         int ans = 0;
         for(int i = 1; i <= 11; i++)
            ans = max(ans, dp[i][T]);         //取最大值
         printf("%d\n",ans);
     }
     return 0;
}
/*input:
6
5 1
4 1
6 1
7 2
7 2
8 3
0
output:
4*/
 

 

 

posted on 2012-07-25 13:33  acmer-jun  阅读(163)  评论(0编辑  收藏  举报

导航