这个题自己生想想出了状态转移方程。
结果边界没有处理好。 把边界处理处理就A了
后来看了一下题解。 才知道是 《数塔》 数塔也就是 数字三角形。 如果知道是数塔这个状态转移方程明显很好写。。
我没按照数塔的思路写。 其实也差不多。 就是按照题意。 对于每一秒 他可能走到的每一个位置的最大值是多少。
这一秒 这一个位置肯定来自于 上一秒 上一个位置。然后就写出来了
#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
struct Time{
int x;
int t;
friend bool operator < (Time a, Time b){
return a.t < b.t;
}
};
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);
}
}
printf("%d\n",M);
}
return 0;
}