题目链接:

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;
}

posted on 2021-11-12 11:35  Hamine  阅读(44)  评论(0编辑  收藏  举报