链接: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
",dp[0][5]);//起点
}
return 0;
}