1 条题解
-
0
文字教学
这是一道经典的动态规划问题,核心是记录不同状态下的最优解,避免重复计算。
- 状态定义:设
f[i][j]表示前i分钟,贝茜移动了j次时,最多能接到的苹果数。 - 位置判断:移动次数
j的奇偶性决定当前位置:j为偶数在1号树,奇数在2号树。 - 状态转移:对于第
i分钟的苹果,有两种选择:- 不移动:从
f[i-1][j]转移,若当前位置能接到苹果则加1。 - 移动(若
j>0):从f[i-1][j-1]转移,若当前位置能接到苹果则加1。 取两者最大值作为f[i][j]的值。
- 不移动:从
- 最终答案:在
f[T][0...W]中找最大值,因为最多移动W次。
代码
#include <bits/stdc++.h> using namespace std; int t, w; int a[1005]; int f[1005][35]; int main() { cin >> t >> w; for (int i = 1; i <= t; i++) { cin >> a[i]; } for (int i = 1; i <= t; i++) { for (int j = 0; j <= w; j++) { int pos = (j % 2 == 0) ? 1 : 2; int cnt = (a[i] == pos) ? 1 : 0; int val1 = f[i-1][j] + cnt; if (j == 0) { f[i][j] = val1; } else { int val2 = f[i-1][j-1] + cnt; f[i][j] = max(val1, val2); } } } int ans = 0; for (int j = 0; j <= w; j++) { ans = max(ans, f[t][j]); } cout << ans << endl; return 0; } - 状态定义:设
- 1
信息
- ID
- 1708
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 3
- 已通过
- 3
- 上传者
京公网安备 11011102002149号