//这道题可以转换成数塔问题 //将时间为纵轴,距离为横轴 //从上往下DP //DP[i][j] = max{DP[i+1][j-1],DP[i+1][j],DP[i+1][j+1]} + a[i][j] //吐槽一下,WA了很多次,原因是max函数写错了尼玛啊啊 #include <stdio.h> #include <string.h> #define max(a,b) a>b?a:b int n; int a[100001][11]; int DP[100001][11]; int max1(int a,int b,int c) { int max2; max2 = a > b?a:b; max2 = max2 > c?max2:c; return max2; } int main() { while(scanf("%d",&n) != EOF) { if( n == 0) break; int x,T; memset(a,0,sizeof(a)); memset(DP,0,sizeof(DP)); int max_T = 0; for(int i = 0; i < n; i++) { scanf("%d%d",&x,&T); a[T][x] ++; DP[T][x] = a[T][x]; if(T > max_T) { max_T = T; } } for(int i = 0; i <= 10; i++) { DP[max_T][i] = a[max_T][i]; } for(int i = max_T-1; i >= 0; i--) { for(int j = 1; j <= 9; j++) { DP[i][j] = max1(DP[i+1][j-1],DP[i+1][j+1],DP[i+1][j]) + a[i][j]; } DP[i][0] = max(DP[i+1][0],DP[i+1][1]) + a[i][j]; DP[i][10] = max(DP[i+1][9],DP[i+1][10]) + a[i][j]; } printf("%d\n",DP[0][5]); } return 0; }