据说是经典题,状态方程不难设计,一开始自己从低往上推,错了,没想明白为什么,看了人家思路才知道,原来固定了初始位置。
这样从低往上推就不能保证初始位置在5,所以应该从上往下来推才行。有个把月没做题了,思维迟钝了。
#include <stdio.h>
#include <string.h>
#define N 100005
#define MAX(a, b) (a > b ? a : b)
int f[N][11];
int main()
{
int n, x, t, maxTime, ans;
while(scanf("%d", &n), n)
{
maxTime = 1;
ans = 0;
memset(f, 0, sizeof(f));
for(int i = 0; i < n; i++)
{
scanf("%d %d", &x, &t);
f[t][x]++;
if(t > maxTime) maxTime = t;
}
for(int i = maxTime; i >= 0; i--)
{
f[i][0] += MAX(f[i + 1][0], f[i + 1][1]);
for(int j = 1; j < 10; j++)
{
f[i][j] += MAX(f[i + 1][j], MAX(f[i + 1][j - 1], f[i + 1][j + 1]));
}
f[i][10] += MAX(f[i + 1][9], f[i + 1][10]);
}
printf("%d\n", f[0][5]);
}
return 0;
}