洛谷 P10108 [GESP202312 六级] 闯关游戏-普及-

题目描述

你来到了一个闯关游戏。

这个游戏总共有 NNN 关,每关都有 MMM 个通道,你需要选择一个通道并通往后续关卡。其中,第 iii 个通道可以让你前进 aia_iai 关,也就是说,如果你现在在第 xxx 关,那么选择第 iii 个通道后,你将直接来到第 x+aix+a_ix+ai 关(特别地,如果 x+ai≥Nx + a_i \geq Nx+aiN,那么你就通关了)。此外,当你顺利离开第 sss 关时,你还将获得 bsb_sbs 分。

游戏开始时,你在第 000 关。请问,你通关时最多能获得多少总分。

输入格式

第一行两个整数 NNNMMM,分别表示关卡数量和每关的通道数量。

接下来一行 MMM 个用单个空格隔开的整数 a0,a1⋯ ,aM−1a_0,a_1\cdots,a_{M-1}a0,a1,aM1。保证 1≤ai≤N1\le a_i \le N1aiN

接下来一行 NNN 个用单个空格隔开的整数 b0,b1⋯ ,bN−1b_0,b_1\cdots,b_{N-1}b0,b1,bN1。保证 ∣bi∣≤105|b_i|\le 10^5bi105

输出格式

一行一个整数,表示你通关时最多能够获得的分数。

输入输出样例 #1

输入 #1

6 2 
2 3
1 0 30 100 30 30

输出 #1

131

输入输出样例 #2

输入 #2

6 2
2 3
1 0 30 100 30 -1

输出 #2

101

说明/提示

样例解释 1

你可以在第 000 关选择第 111 个通道,获得 111 分并来到第 333 关;随后再选择第 000 个通道,获得 100100100 分并来到第 555 关;最后任选一个通道,都可以获得 303030 分并通关。如此,总得分为 1+100+30=1311+100+30=1311+100+30=131

样例解释 2

请注意,一些关卡的得分可能是负数。

数据范围

对于 20%20\%20% 的测试点,保证 M=1M=1M=1

对于 40%40\%40% 的测试点,保证 N≤20N \le 20N20;保证 M≤2M\le 2M2

对于所有测试点,保证 1≤N≤1041 \le N \le 10^41N104;保证 1≤M≤1001 \le M\le 1001M100

solution

基本的动态规划,在每一关,遍历每一个通道,保存下到每一关的最大的得分即可

代码

#include <iostream>
#include "bit"
#include "vector"
#include "unordered_set"
#include "set"
#include "queue"
#include "algorithm"
#include "bitset"

using namespace std;

const int N = 1e4 + 1;

int n, m, f[N], a[100], b[N];

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; i++) cin >> a[i];
    for (int i = 0; i < n; i++) cin >> b[i], f[i] = -1e9;

    f[n] = -1e9;
    f[0] = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            int k = min(n, i + a[j]);
            f[k] = max(f[k], f[i] + b[i]);
        }
    }
    cout << f[n];
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智趣代码实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值