简要分析:
1、空间换时间。边缘数组多开,不用进行首尾的特殊处理。
2、0 不影响结果
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f
#define ms(x, y) memset(x, y, sizeof(x))
const double PI = acos(-1.0), eps = 1e-8;
int map[100010][13]; // row -> 时间 col -> 位置
int main() {
int n,i,j,k,pos,tm,maxT;
while(scanf("%d",&n), n) {
ms(map, 0);
maxT = -1;
for(i=0; i<n; i++) {
scanf("%d%d",&pos,&tm);
map[tm][pos+1] += 1;
maxT = tm>maxT ? tm:maxT;
}
for(i=maxT-1; i>-1; i--) // 倒数第二层开始遍历
for(j=1; j<12; j++)
map[i][j] += max(max(map[i+1][j-1],map[i+1][j]),map[i+1][j+1]); // 两个max选择出三个中最大的
printf("%d\n",map[0][6]);
}
return 0;
}