HNU数据结构实验七 数组跳远(增强版)

【问题描述】

 

【输入形式】

           输入的第一行为一个整数 t (1≤ t ≤ 104),表示测试用例的组数。

           每个测试用例的第一行为一个整数 (1≤ n ≤ 2×105),表示数组 a 的元素个数

           接下来一行包含 n 个整数 a1a2、...、an (1 ≤ ai ≤ 109),表示数组 a 的元素

【输出形式】

     对于每个测试用例,输出独立一行,表示选择合适的开始位置后经过上述操作可以获得的最大分数。

【样例输入】

4
5
7 3 1 2 3
3
2 1 4
6
2 1000 2 3 995 1
5
1 1 1 1 1

【样例输出】

7
6
1000
5

【判例说明】

     20%的测试数据 n≤10000 

     70%的测试数据 n≤100000 

     100%的测试数据 n≤200000 

完整代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        vector<int> a(n + 1, 0);//使用n+1避免越界,最后一个位置不使用
        for (int i = 1; i <= n; i++) cin >> a[i];
        vector<int> dp(n + 1, 0);//dp数组用于记录位置i开始可获最大分数
        for (int i = n; i >= 1; i--)//从后向前更新
        {
            //如果可以跳转,则更新dp[i]为当前分数加dp[i + a[i]],如果i + a[i] > n,则加0
            if (i + a[i] <= n) dp[i] = a[i] + (i + a[i] > n ? 0 : dp[i + a[i]]);
            else dp[i] = a[i];
        }
        int maxscore = 0;
        for (int i = 1; i <= n; i++) maxscore = max(maxscore, dp[i]);
        cout << maxscore << endl;
    }
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值