当前位置: 首页 > 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;
}

相关文章:

  • 爬虫抓取数据时如何处理异常?
  • 物联网通信应用案例之《智慧农业》
  • 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:模拟插入数据和查询(带时间)
  • 人民日报评“组团退演出服”:市场经济诚信原则需全社会维护
  • 南通市委常委、市委秘书长童剑跨市调任常州市委常委、组织部部长
  • 商务部新闻发言人就中美经贸高层会谈答记者问
  • 五一多城楼市火热:北京新房网签量同比翻倍,上海热门楼盘认购接连触发积分
  • 夜读丨最美的风景,在亲人的目光里
  • 陕西礼泉一村民被冒名贷款40余万,法院发现涉嫌经济犯罪驳回起诉