链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=613


dp[i ][j ] :第i秒在位置 j 的最大接到馅饼的量


从接完馅饼的最终位置开始判断,不断取最大的,倒推到起点。即得到最大值



#include <iostream>
#include <cstdio>
#include <cstring>
#define MAX_T 100000
using namespace std;
pair <int ,int > p;
int dp[MAX_T+5][15];                //第i 秒,在位置j 的最大值
int max_3(int a,int b,int c)
{
    if(a<b) a=b;
    if(a<c) a=c;
    return a;

}
int main()
{

    int n;
    int T;
    while(scanf("%d",&n)&&n!=0)
    {
        T=0;
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&p.first,&p.second);
            dp[p.second][p.first]++;
            T= T>p.second?T:p.second;
        }
        for(int i=T; i>=0; i--)
            for(int j=0; j<11; j++)
            {
                dp[i][j]+=max_3(dp[i+1][j],dp[i+1][j-1],dp[i+1][j+1]);
            }
        printf("%d\n",dp[0][5]);//起点



    }
    return 0;
}