是一个数塔问题。 没看出来。 一开始没看出来
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 100000+10
#define INF 1 << 30
int d[MAXN][20];
int wh[MAXN][20];
int main (){
int n;
while(scanf("%d",&n) != EOF && n){
int T = 0;
memset(wh,0,sizeof(wh));
memset(d,-1,sizeof(d));
for(int i = 1; i <= n; i++){
int x,t;
scanf("%d%d",&x,&t);
wh[t][x]++;
T = max(T, t);
}
d[0][5] = 0;
int M = 0;
for(int i = 1; i <= T; i++){
for(int j = 0; j <= 10; j++){
if((( j >= 1 && d[i-1][j-1] >= 0) || (d[i-1][j+1] >= 0 && j+1 <= 10) || d[i-1][j] >= 0)){
if(j >= 1)
d[i][j] = max(d[i][j], d[i-1][j-1]+wh[i][j]);
if(j+1 <= 10)
d[i][j] = max(d[i][j], d[i-1][j+1]+wh[i][j]);
d[i][j] = max(d[i][j], d[i-1][j]+wh[i][j]);
}
M = max(d[i][j],M);
}
}
// for(int i = 1; i <= T; i++){
// for(int j = 0; j <= 10; j++)
// printf("%d %d %d\n",i,j,d[i][j]);
// }
printf("%d\n",M);
}
return 0;
}