思路:定义dp[i][j]表示第 i 秒时在第 j 个位置上能的得到的最大值。
dp[i][j] = max(dp[i-1][j-1], max(dp[i-1][j], dp[i-1][j+1])) + a[i][j]。(1≤i≤T,0≤j≤10)
答案为:max(dp[T][i]) (0≤i≤10)
为了防止越界我们可以将,坐标都加1。我们还可以从最后一秒推到第一秒,那么这样最终dp[0][6]就是答案。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
int n, a[MAXN][15], dp[MAXN][15];
int main()
{
while (~scanf("%d", &n) && n)
{
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof(a));
int T = 0;
for (int i = 0; i < n; i++)
{
int x, t; scanf("%d%d", &x, &t); x++;
a[t][x]++;
T = max(T, t);
}
for (int i = T; i >= 0; i--)
{
for (int j = 1; j <= 11; j++)
{
dp[i][j] = max(dp[i+1][j-1], max(dp[i+1][j], dp[i+1][j+1]));
dp[i][j] += a[i][j];
}
}
printf("%d\n", dp[0][6]);
}
return 0;
}
/*
6
5 1
4 1
6 1
7 2
7 2
8 3
0
*/