P10108 [GESP202312 六级] 闯关游戏

news/2025/2/28 2:03:54/

题目大意

如题
、

分析

设最佳通关方案为 { s 1 , s 2 , . . . , s k } \{s_1,s_2,...,s_k\} {s1,s2,...,sk},其中 s i s_i si 代表第 i i i 次到达的关卡( ≥ N \ge N N 的不算)。

  • a k = N − 1 a_k=N-1 ak=N1 时,方案变为 { s 1 , s 2 , . . . , s k − 1 , N − 1 } \{s_1,s_2,...,s_{k-1},N-1\} {s1,s2,...,sk1,N1}
    方案的属性:

    1. 总分。原方案的总分 = 子方案的总分+ b N − 1 b_{N-1} bN1。由于,原方案要求解的是最高总分。因此,子方案要求解的也是最高总分。
    2. 目的地。子方案的目的地变为 N − 1 N-1 N1

    综上:子方案反映的问题是目的地为 N − 1 N-1 N1,能够获得的最高总分?

  • a k = N − 2 a_k=N-2 ak=N2 时,方案变为 { s 1 , s 2 , . . . , s k − 1 , N − 2 } \{s_1,s_2,...,s_{k-1},N-2\} {s1,s2,...,sk1,N2}
    方案的属性:

    1. 总分。原方案的总分 = 子方案的总分+ b N − 2 b_{N-2} bN2。由于,原方案要求解的是最高总分。因此,子方案要求解的也是最高总分。
    2. 目的地。子方案的目的地变为 N − 2 N-2 N2

    综上:子方案反映的问题是目的地为 N − 2 N-2 N2,能够获得的最高总分?
    ⋮ \vdots

  • a k = 1 a_k=1 ak=1 时,方案变为 { s 1 , s 2 , . . . , s k − 1 , 1 } \{s_1,s_2,...,s_{k-1},1\} {s1,s2,...,sk1,1}
    方案的属性:

    1. 总分。原方案的总分 = 子方案的总分+ b 1 b_1 b1。由于,原方案要求解的是最高总分。因此,子方案要求解的也是最高总分。
    2. 目的地。子方案的目的地变为 1 1 1

    综上:子方案反映的问题是目的地为 1 1 1,能够获得的最高总分?

需要注意的是,这些子问题的合法需满足:存在这么一个通道,可以从子方案的目的地,直接到达 ≥ N \ge N N 的地方。

因为,原问题不存在这么一个准确的目的地,这与子问题不符合。所以,我们需要将超过 N N N 的情况,拆解为:到达 N + 1 N+1 N+1 N + 2 N+2 N+2,…, 2 N 2N 2N 的问题(之所以是 2 N 2N 2N 是因为, a i ≤ N a_i\le N aiN)。

现在,所有的问题都变为:目的地为 i i i,能够获得的最高总分?

对其方案重新进行分析:

  • a k = j a_k=j ak=j 时,方案变为 { s 1 , s 2 , . . . , s k − 1 , j , i } \{s_1,s_2,...,s_{k-1},j,i\} {s1,s2,...,sk1,j,i}
    方案的属性:

    1. 总分。原方案的总分 = 子方案的总分+ b j b_j bj。由于,原方案要求解的是最高总分。因此,子方案要求解的也是最高总分。
    2. 目的地。子方案的目的地变为 j j j

    综上:子方案反映的问题是目的地为 j j j,能够获得的最高总分?

需要注意的是,必须存在一种通道使得 j j j 能够到达 i i i 这种情况才合法。因此,直接通过枚举所有通道,就可以获得所有合法情况。

问题的状态: d p i dp_i dpi 代表目的地为 i i i,能够获得的最高总分?

状态转移式: d p i = max ⁡ ( d p i − a j + b j ) ( 1 ≤ j ≤ m ) dp_i=\max(dp_{i-a_j}+b_j)(1\le j \le m) dpi=max(dpiaj+bj)(1jm)

问题的初始化: d p 0 = 0 dp_0=0 dp0=0

问题的答案: max ⁡ ( d p i ) ( n + 1 ≤ i ≤ 2 n ) \max(dp_i)(n+1\le i \le2n) max(dpi)(n+1i2n)

示例程序

#include<iostream>
#include<algorithm>using namespace std;const int N = 1e4 + 10;int a[N],b[N * 2],dp[N * 2];int main(){int n,m;cin >> n >> m;for(int i = 0; i <= m - 1; i++){cin >> a[i];}for(int i = 0; i <= n - 1; i++){cin >> b[i];}for(int i = 0; i <= 2 * n; i++) dp[i] = -1e9;dp[0] = 0;int maxn = -1e9;for(int i = 1; i <= 2 * n - 1; i++){for(int j = 0; j <= m - 1; j++){if(i - a[j] >= 0){dp[i] = max(dp[i],dp[i - a[j]] + b[i - a[j]]);}}if(i >= n){maxn = max(maxn,dp[i]);}}cout << maxn;return 0;
}

http://www.ppmy.cn/news/1575385.html

相关文章

机器学习介绍与数据集

一、机器学习介绍与定义 1.1 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;是让计算机从数据中自动学习规律&#xff0c;并依据这些规律对未来数据进行预测的技术。它涵盖聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep Learning&#xf…

DeepSeek-R1技术全解析:如何以十分之一成本实现OpenAI级性能?

一、现象级爆火背后的技术逻辑 2025年1月20日&#xff0c;中国AI公司深度求索&#xff08;DeepSeek&#xff09;发布新一代大模型R1&#xff0c;其性能直接对标OpenAI的o1版本&#xff0c;但训练成本仅为后者的1/20&#xff08;600万美元 vs. 1.2亿美元&#xff09;&#xff0…

GaussDB 学习实战指南:从部署到高并发优化的全流程解析

引言 GaussDB 作为华为推出的高性能分布式数据库,凭借其 分布式架构、高可用性、云原生支持 等特性,成为企业级应用的核心选择。本文将以 实战操作为核心,覆盖 集群部署、数据分片、性能调优、容灾备份、云上迁移 五大场景,通过真实案例与代码示例,助你快速掌握 GaussDB …

AI数字人开发,引领科技新潮流

引言 随着人工智能技术的迅猛发展&#xff0c;AI 数字人在影视娱乐、客户服务、教育及医疗等多个领域展现出巨大的潜力。本文旨在为开发者提供一份详细的 AI 数字人系统开发指南&#xff0c;涵盖从基础架构到实现细节的各个方面&#xff0c;包括人物建模、动作生成、语音交互、…

开发HarmonyOS NEXT版五子棋游戏实战

大家好&#xff0c;我是 V 哥。首先要公布一个好消息&#xff0c;V 哥原创的《鸿蒙HarmonyOS NEXT 开发之路 卷1&#xff1a;ArkTS 语言篇》图书终于出版了&#xff0c;有正在学习鸿蒙的兄弟可以关注一下&#xff0c;写书真是磨人&#xff0c;耗时半年之久&#xff0c;感概一下…

​腾讯云 轻量云对象存储

腾讯云轻量云对象存储&#xff08;COS&#xff09;是一款为中小企业、开发者及个人用户提供的简化、低成本、易用的云存储服务。它提供高效、灵活的对象存储解决方案&#xff0c;用户可以通过腾讯云轻量云对象存储轻松存储、管理和访问海量非结构化数据。通过简单的操作&#x…

Vue2+OpenLayers实现右键菜单功能(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 完整代码: <templat

哈希表-两个数的交集

代码随想录-刷题笔记 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 内容: 集合的使用 , 重复的数剔除掉&#xff0c;剩下的即为交集&#xff0c;最后加入数组即可。 class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer…