题目链接:
http://39.98.219.132/problem/1967
题目大意:
小明走在小路上,路可以抽象成一个 数轴 ,坐标从 0 到 10, 小明在第 0 秒在 5 的位置, 天上掉下 n 个馅饼,第 t 秒有一个馅饼掉到 p 位置,如果当前在 k 位置, 那么下一秒可以移动到 k - 1,k + 1 这两个位置去接馅饼,馅饼掉到地上就不可以吃了,问 最多 可以接到几个馅饼。
思路:
构建二维 dp 数组, dp[i][j] 表示第 i 秒在 p 位置能接到的最大的馅饼数,得到 转移方程 dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j], dp[i - 1][j + 1])。
再根据第 0 秒处在 5 的位置,我们可以想到循环由大到小,转移方程中就变为 i 从 i + 1 转移,最后输出 dp[0][5]。
又因为数轴从 0 到 10, i - 1 会越界, 于是我们可以考虑将数轴向右移动,从 1 到 11。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 10;
int n, p, t, dp[MAX][15], maxn;
int main(){
cin >> n;
for (int i = 1; i <= n; i++){
scanf("%d %d", &p, &t);
dp[t][p + 1] += 1; // p + 1 实现数轴右移
maxn = max(t, maxn);
}
for (int i = maxn; 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]));
cout << dp[0][6] << "\n";
return 0;
}