解题思路:动态规划
可以看成倒的塔,这个地方转换过来就快了,状态转移方程:
d[i][j] = max(d[i+1][j-1], d[i+1][j], d[i+1][j-1])
最后答案是d[0][6]
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
#define clr(p,v) memset(p,v,sizeof(p))
const int maxn = 100010 ;
int n, m, C;
int d[maxn][13];
int main()
{
while (~scanf("%d",&n) && n)
{
clr(d, 0);
int tMax = -1;
//Input
for (int i=1; i<=n; ++i)
{
int x, T;
scanf("%d%d", &x, &T);
++d[T][x+1];
tMax = max(tMax, T);
}
//Calculate
for (int i=tMax-1; i>=0; --i)
{
for (int j=1; j<=11; ++j)
{
d[i][j] += max(d[i+1][j], max(d[i+1][j-1], d[i+1][j+1]));
}
}
//output
printf("%d\n", d[0][6]);
}
return 0;
}