这道题想了挺久,一开始想从上到下解决,后来才发现是要从底部开始的。可以把这些数据想象成一个矩阵,横轴是时间,纵轴是地标。然后可以从底部开始向上一秒或上一个横轴递推。里面要注意的是
1.上一个排的数的值是本身值加上下一排三个数最大值
2.数组数据在用完以后要清零
3.最后要取的值是a[0][5],a[0][4],a[0][6]三个值里面的最大值
#include<iostream>
#include<string.h>
using namespace std;
int a[100002][12]={0};
int max(int x,int y){
if(x>=y)
return x;
else
return y;
}
int main(){
int n,t,x,flag;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
memset(a,0,sizeof(a));
flag=0;
while(n--){
scanf("%d %d",&x,&t);
a[t-1][x]++;
if(flag<t)
flag=t;
}
for(int i=flag-1;i>=0;i--)
for(int j=0;j<11;j++)
a[i-1][j]+=max(a[i][j],max(a[i][j-1],a[i][j+1]));
printf("%d\n",max(max(a[0][4],a[0][5]),a[0][6]));
}
return 0;
}