/*dp入门级的题目,和数塔是一样的,这道题不用做什么优化,感觉时间复杂度不会超。主要还是细节上的问题,
这道题的状态和状态方程都容易找到,采用自底向上的方式会好很多*/
#include"iostream"
#include"algorithm"#include"stdio.h"#include"string.h"#include"cmath"#include"queue"#define mx 100005using namespace std;int dp[13][mx];//刚开始把13和mx写反了。。。wa了两次int n;int Max(int c,int b){ if(c>b) return c; else return b;}int main(){ while(cin>>n,n) { int i,j,k; memset(dp,0,sizeof(dp)); int x,t,t1; t=0; for(i=0;i<n;i++) { cin>>x>>t1; dp[x+1][t1]++; if(t1>t) t=t1;//这里要注意输入不一定是按时间递增的顺序 } for(i=t;i>0;i--) for(j=1;j<=11;j++) { dp[j][i-1]+=Max(dp[j-1][i],Max(dp[j][i],dp[j+1][i])); } cout<<dp[6][0]<<endl; } return 0;}