链接: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; }