/*题都是有一个状态转移方程式 , 只要推出方程式就问题不大了,首 先对于gameboy来说他下一秒只能 在0~10这十一个位置移动, 而对于1~9这九个位置来说他可以移动(假设他现在的位置为x)到x+1,或者x-1,或者x; 0和10这两个位置只有两个位置可以移动, 可以用dp[t][x],t秒的馅饼获得就看t-1秒时的下一位置(x+1,x,x-1) 因为要求整个过程的最大值,因此求的是dp累加的和, 所以状态转移方程式为 dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1])); */ #include<cstring> #include<iostream> #include<algorithm> #include<math.h> #include<stdio.h> using namespace std; int dp[150000][20]; int main() { int n; while(scanf("%d",&n),n) { int t,x,tt=0; memset(dp,0,sizeof(dp)); for(int i=0; i<n; i++) { scanf("%d %d",&x,&t); //t是时间 //x+1是位置加1 dp[t][x+1]++; tt=max(tt,t); } int res=0; //只有最开始的位置是确定的,所以从后面的时间往前 for(int i=tt-1; i>=0; i--) //往前面推,在此位置接到的馅饼数,是这一位置接到的加上上一秒接到的和 for(int j=12; j>=0; j--) dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1])); //初始位置在5号位置, cout<<dp[0][6]<<endl; } return 0; }