当前位置: 首页 > news >正文

P10108 [GESP202312 六级] 闯关游戏

题目大意

如题
、

分析

设最佳通关方案为 { 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.dtcms.com/a/39060.html

相关文章:

  • 爬虫抓取数据时如何处理异常?
  • 物联网通信应用案例之《智慧农业》
  • SOME/IP-SD -- 协议英文原文讲解6
  • 嵌入式配置结构体的版本管理策略
  • mysql有索引但是查询没有使用索引是什么问题
  • [uboot][stm32]配置LTDC屏幕
  • AI如何改变传统工厂的生产模式?
  • Nginx 平滑升级/回滚
  • 免费的 S3 客户端工具:s3cmd
  • 特斯拉 FSD 算法深度剖析:软件层面全解读
  • 深入理解Java多线程编程:从基础到高级应用
  • 【机器人系列之硬件和软件架构设计】
  • OpenHarmony应用间跳转
  • Lua的table(表)
  • JSON Schema 入门指南:如何定义和验证 JSON 数据结构
  • QT和有道词典有冲突,导致内存溢出,闪退。
  • neo4j 和 langchain_community.graphs.Neo4jGraph 对比
  • 前缀和专题练习 ——基于罗勇军老师的《蓝桥杯算法入门C/C++》
  • 机试刷题_NC17 最长回文子串【python】
  • PostgreSQL:模拟插入数据和查询(带时间)
  • 三轴加速度推算姿态角的方法,理论分析和MATLAB例程
  • Leetcode3162:优质数对的总数 I
  • Spring Boot @Async 注解深度指南
  • 湘潭大学计算机复试详细攻略(调剂)
  • Ubuntu 下 nginx-1.24.0 源码分析 - NGX_CYCLE_POOL_SIZE 宏
  • 智能生活综合平台需求规格说明书
  • 弱监督语义分割学习计划(1)-简单实现CAM但是效果不好
  • wordpress按不同页调用不同的标题3种形式
  • AOP进阶-02.通知顺序
  • 上传securecmd失败