经典反向dp,多练练
import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[][] sta,dp;
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
sta=new int[ 12][100010];
dp=new int[12][100010]; //第n秒最大的收获
while(sc.hasNext()) {
int n =sc.nextInt();
if(n==0)break;
for(int i=0;i<12;i++)
for(int j=0;j<100010;j++)
{
sta[i][j]=0;
dp[i][j]=0;
}
int maxtime=0;
for(int i=0;i<n;i++) {
int a=sc.nextInt();
int b =sc.nextInt();
sta[a][b]++;
if(b>maxtime)maxtime=b;
}
for(int i=0;i<11;i++) dp[i][maxtime] = sta[i][maxtime];
for(int i= maxtime-1;i>=0 ;i--) { ///时间从后向前
for(int j=0;j<11;j++) {
if(j==0) { //如果在 i 时刻的 0位置 ,那么避免出现下标-1,单独处理
dp[0][i]=Math.max( dp[0][i+1], dp[1][i+1] )+ sta[0][i];
}else {
dp[j][i]= Math.max( dp[j-1][i+1], Math.max(dp[j][i+1],dp[j+1][i+1]))+sta[j][i];
}
}
}
System.out.println(dp[5][0]);
}
}
}