1 条题解

  • 0
    @ 2026-10-18 18:41:05

    G6021 [GESP202603 六级] 选数 题解

    知识点:动态规划、序列选择、跳跃状态。

    解题思路

    令dp[i]为从i开始能取的最大和。不选i取dp[i+1];选i则加a[i]并跳到至少i+b[i],倒序取两者最大。

    为什么正确

    任何合法方案按是否选当前下标分两类,选中后所有后继必须满足跳跃下界,后缀最优即可独立衔接。

    易错点

    下标必须严格增加,代码用max(1,b[i])保护推进;越过末尾映射到空后缀。

    复杂度

    时间O(n),空间O(n)。

    参考代码(C++17)

    #include<bits/stdc++.h>
    
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int n;
        cin>>n;
        vector<long long>a(n);
        vector<int>b(n);
        for(auto &x:a)cin>>x;
        for(auto &x:b)cin>>x;
        vector<long long>dp(n+1);
        for(int i=n-1;i>=0;i--)dp[i]=max(dp[i+1],a[i]+dp[min(n,i+max(1,b[i]))]);
        cout<<dp[0];
    }
    

    说明

    本题解为配套教学整理,非官方题解。复杂度按本页参考实现计算,题库使用12个自行生成的测试点。

    • 1

    信息

    ID
    771
    时间
    1000ms
    内存
    512MiB
    难度
    普及
    标签
    递交数
    0
    已通过
    0
    上传者