基础动态规划题。设 dp[i][j] 表示从 i 时刻 j 位置开始,最终能接到的最大馅饼数。
dp[i][j] = max(dp[i + 1][j + 1], dp[i + 1][j], dp[i + 1][j - 1]) + 原本的dp[i][j]
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int dp[MAXN][12]; //dp[i][j]表示从i时刻j位置开始,最终能接到的最大馅饼数
int main()
{
int n, x, t;
while (scanf("%d", &n) != EOF)
{
if (n == 0)
break;
memset(dp, 0, sizeof(dp));
int maxT = 0;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &x, &t);
dp[t][x]++;
if (t > maxT)
maxT = t;
}
for (int i = maxT - 1; i >= 0; i--)
{
for (int j = 0; j <= 10; j++)
dp[i][j] += max(dp[i + 1][j + 1], max(dp[i + 1][j], dp[i + 1][j - 1]));
}
printf("%d\n", dp[0][5]);
}
return 0;
}
继续加油。