把时间看成层数,就成了简单的数塔了
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn=100010;
int dp[maxn][11],n;
int main(){
while (scanf("%d",&n)&&n){
memset(dp,0,sizeof(dp));
int maxn=0;
for (int i=0;i<n;++i){
int x,t;
scanf("%d%d",&x,&t);
++dp[t][x];
maxn=max(maxn,t);
}
int leftb=4,rightb=6,prel=4,prer=6;
for (int i=1;i<=maxn;++i){
int minl=maxn,maxr=0;
for (int j=leftb;j<=rightb;++j){
int maxv=0;
for (int k=-1;k<=1;++k){
if(j+k>=0&&j+k<=10){
minl=min(minl,j+k);
maxr=max(maxr,j+k);
maxv=max(maxv,dp[i-1][j+k]);
}
}
dp[i][j]+=maxv;
}
prel=leftb,prer=rightb;
leftb=minl,rightb=maxr;
}
int ans=0;
for (int i=prel;i<=prer;++i){
ans=max(ans,dp[maxn][i]);
}
printf("%d\n",ans);
}
return 0;
}