news 2026/6/26 4:29:07

问题解决策略动态规划训练3

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
问题解决策略动态规划训练3

ai写的。

问题 A: 求子数组的最大和(动态规划)

题目描述

输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。

输入

一个整型数组。

输出

子数组的和的最大值。

输入输出样例

样例输入 #1

复制

1 -2 3 10 -4 7 2 -5
样例输出 #1

复制

18

提示

数组长度最大为 500005000050000

问题 B: 动态规划进阶题目之货币面值

题目描述

小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧。

输入

输入包含多个测试用例,每组测试用例的第一行输入一个整数 NNN (N≤100)(N \le 100)(N≤100) 表示流通的纸币面额数量,第二行是 NNN 个纸币的具体表示面额,取值 [1,100][1, 100][1,100]。

输出

对于每组测试用例,输出一个整数,表示已经发行的所有纸币都不能表示的最小面额(已经发行的每个纸币面额最多只能使用一次,但面值可能有重复)。

输入输出样例

样例输入 #1

复制

5 1 2 3 9 100 5 1 2 4 9 100 5 1 2 4 7 100
样例输出 #1

复制

7 8 15

提示

注意一下给出的货币面值可能不是升序排列的。

#include<iostream> #include<vector> #include<algorithm> #define int long long using namespace std; signed main() { int n; while(cin >> n) { vector<int> a(n); int sum = 0; for(int i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; } sort(a.begin(), a.end()); vector<int> dp(sum + 1, 0); dp[0] = 1; for(int i = 0; i < n; i++) for(int j = sum; j >= a[i]; j--) if(dp[j - a[i]]) dp[j] = 1; int ans = 1; while(ans <= sum && dp[ans]) ans++; cout << ans << endl; } return 0; }

问题 C: 动态规划进阶题目之最佳加法表达式

题目描述

有一个由 [1,9][1, 9][1,9] 组成的数字串,问如果将 mmm 个加号插入到这个数字串中,在各种可能形成的表达式中,值最小的那个表达式的值是多少。

例如,在 123412341234 中摆放 111 个加号,最好的摆法就是 12+3412+3412+34,和为 363636。

输入

有不超过 151515 组数据。

每组数据两行。

第一行是整数 mmm,表示有 mmm 个加号要放 (0≤m≤17)(0 \le m \le 17)(0≤m≤17)。

第二行是若干个数字。数字总数 nnn 不超过 181818 且 m≤n−1m \le n-1m≤n−1。

输出

对每组数据,输出最小加法表达式的值。

输入输出样例

样例输入 #1

复制

2 123456 1 123456 4 12345
样例输出 #1

复制

102 579 15
#include<iostream> #include<vector> #include<string> #include<algorithm> #include<climits> #define int long long using namespace std; signed main() { int m; string s; while(cin >> m >> s) { int n = s.size(); vector<vector<int>> num(n, vector<int>(n, 0)); for(int i = 0; i < n; i++) { int cur = 0; for(int j = i; j < n; j++) { cur = cur * 10 + (s[j] - '0'); num[i][j] = cur; } } vector<vector<int>> dp(n, vector<int>(m + 1, LLONG_MAX)); for(int i = 0; i < n; i++) dp[i][0] = num[0][i]; for(int j = 1; j <= m; j++) for(int i = j; i < n; i++) for(int k = j - 1; k < i; k++) if(dp[k][j-1] != LLONG_MAX) dp[i][j] = min(dp[i][j], dp[k][j-1] + num[k+1][i]); cout << dp[n-1][m] << endl; } return 0; }

问题 D: 小A点菜

题目描述

uim 神犇拿到了 uoi 的 ra(镭牌)后,立刻拉着基友小 A 到了一家……餐馆,很低端的那种。

uim 指着墙上的价目表(太低级了没有菜单),说:“随便点”。

不过 uim 由于买了一些书,口袋里只剩 MMM 元 (M≤10000)(M \le 10000)(M≤10000)。

餐馆虽低端,但是菜品种类不少,有 NNN 种 (N≤100)(N \le 100)(N≤100),第 iii 种卖 aia_iai​ 元 (ai≤1000)(a_i \le 1000)(ai​≤1000)。由于是很低端的餐馆,所以每种菜只有一份。

小 A 奉行“不把钱吃光不罢休”,所以他点单一定刚好把 uim 身上所有钱花完。他想知道有多少种点菜方法。

由于小 A 肚子太饿,所以最多只能等待 111 秒。

输入

第一行是两个数字,表示 NNN 和 MMM。

第二行起 NNN 个正数 aia_iai​(可以有相同的数字,每个数字均在 100010001000 以内)。

输出

一个正整数,表示点菜方案数,保证答案的范围在 int 之内。

输入输出样例

样例输入 #1

复制

4 4 1 1 2 2
样例输出 #1

复制

3
#include<iostream> #include<vector> #include<algorithm> #define int long long using namespace std; signed main() { int n, m; cin >> n >> m; vector<int> a(n); for(int i = 0; i < n; i++) cin >> a[i]; vector<int> dp(m + 1, 0); dp[0] = 1; for(int i = 0; i < n; i++) for(int j = m; j >= a[i]; j--) dp[j] += dp[j - a[i]]; cout << dp[m]; return 0; }

问题 E: 动态规划进阶题目之大盗阿福

题目描述

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。

这条街上一共有 NNN 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。

作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入

输入的第一行是一个整数 TTT (T≤50)(T \le 50)(T≤50),表示一共有 TTT 组数据。

接下来的每组数据,第一行是一个整数 NNN (1≤N≤100000)(1 \le N \le 100000)(1≤N≤100000),表示一共有 NNN 家店铺。第二行是 NNN 个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过 100010001000 。

输出

对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

输入输出样例

样例输入 #1

复制

2 3 1 8 2 4 10 7 6 14
样例输出 #1

复制

8 24

提示

对于第一组样例,阿福选择第 222 家店铺行窃,获得的现金数量为 888。

对于第二组样例,阿福选择第 111 和 444 家店铺行窃,获得的现金数量为 10+14=2410 + 14 = 2410+14=24。

#include<iostream> #include<vector> #include<algorithm> #define int long long using namespace std; signed main() { int T; cin >> T; while(T--) { int n; cin >> n; vector<int> a(n); for(int i = 0; i < n; i++) cin >> a[i]; if(n == 1) { cout << a[0] << endl; continue; } vector<int> dp(n, 0); dp[0] = a[0]; dp[1] = max(a[0], a[1]); for(int i = 2; i < n; i++) dp[i] = max(dp[i-1], dp[i-2] + a[i]); cout << dp[n-1] << endl; } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 4:28:51

不到8个月完成三轮融资!云际航电全栈自研航电系统,欲打破国际垄断

长期被欧美巨头垄断的航电赛道&#xff0c;一家成立不到4年的创业公司云际航电想通过全栈自研打破国际垄断。近期它连续完成两轮融资&#xff0c;首款产品预计下半年取证交付。打破垄断的融资节奏航电赛道长期被欧美巨头垄断&#xff0c;霍尼韦尔等四家吃下超八成份额。云际航电…

作者头像 李华
网站建设 2026/6/26 4:28:46

3分钟配置完成:基于YOLOv5的智能中国象棋AI辅助系统

3分钟配置完成&#xff1a;基于YOLOv5的智能中国象棋AI辅助系统 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款革命性的中国象棋AI辅助工…

作者头像 李华
网站建设 2026/6/26 4:28:34

一线音响品牌集体入局 HiPlay!持证硬件解锁华为全渠道供应链资源

高端音频市场正在迎来一轮生态大变革&#xff0c;过去无线音频生态长期被海外标准垄断&#xff0c;如今华为 HUAWEI HiPlay 搭建起覆盖内容 硬件的完整本土无损投播生态&#xff0c;短短时间内集结国内外头部音响品牌批量接入认证&#xff0c;形成差异化高端音频联盟&#xff…

作者头像 李华
网站建设 2026/6/26 4:28:17

OpenSSL实战指南:数字证书结构解析与全生命周期管理

1. 项目概述&#xff1a;从“信任”说起在数字世界里&#xff0c;我们每天都在进行各种“交易”&#xff1a;登录网站、收发加密邮件、下载软件更新。这些行为的基石&#xff0c;不是密码&#xff0c;而是一种更底层的机制——信任。如何向一个从未谋面的服务器证明“我就是我”…

作者头像 李华
网站建设 2026/6/26 4:27:56

OpenMOSS / MOSS-TTS-Nano TTS文字转语音windows本地部署

0.环境配置 # 创建conda环境 conda create -n moss-tts-nano python3.12 -y conda activate moss-tts-nano# 下载源码 git clone https://github.com/OpenMOSS/MOSS-TTS-Nano.git cd MOSS-TTS-Nano# 安装依赖 pip install -r requirements.txt# 纯本地跑源码不改包结构,可以不用…

作者头像 李华
网站建设 2026/6/26 4:27:46

小程序制作公司哪家好怎么选正规服务商?

小程序制作公司哪家好怎么选正规服务商&#xff1f;中小微企业选择小程序制作公司&#xff0c;不宜只看“哪家名气大”&#xff0c;更应先看业务目标是否清楚、功能是否匹配、收费是否透明、后续服务是否能跟上。根据企业数字化项目实践总结&#xff0c;展示、预约、商城、会员…

作者头像 李华