1 条题解

  • 0
    @ 2026-3-24 9:42:48

    文字教学

    这是一道经典的动态规划问题,核心是记录不同状态下的最优解,避免重复计算。

    1. 状态定义:设 f[i][j] 表示前 i 分钟,贝茜移动了 j 次时,最多能接到的苹果数。
    2. 位置判断:移动次数 j 的奇偶性决定当前位置:j 为偶数在1号树,奇数在2号树。
    3. 状态转移:对于第 i 分钟的苹果,有两种选择:
      • 不移动:从 f[i-1][j] 转移,若当前位置能接到苹果则加1。
      • 移动(若 j>0):从 f[i-1][j-1] 转移,若当前位置能接到苹果则加1。 取两者最大值作为 f[i][j] 的值。
    4. 最终答案:在 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
    上传者