用c++解决下述问题:描述 有些词有力量。它可以使包含它的字符串变得更强大(更大的重量)。字符串中单词的权重定义为其在字符串中的出现次数乘以其值,而字符串的权重定义为所有单词权重的总和。给定一些单词及其值,您应该输出由这些单词组成的字符串,这些单词使字符串的权重最大。输入 输入由多个测试用例组成。输入的第一行是整数 T,表示测试用例的数量。每个测试用例都以一行开头,该行由两个整数组成:N 和 M,指示字符串的最大长度和单词数。以下 M 行中的每一行都包含一个单词 Wi。每个测试用例的最后一行由 M 个整数组成,而第 i 个数字表示 Wi 的值 Vi。技术规格: 1. T ≤ 15 2.0 < N ≤ 50, 0 < M ≤ 100。3.每个单词的长度小于11,大于0。4. 1 ≤ Vi ≤ 100.5.输入中的所有单词都不同。6. 所有单词都由“a”-“z”组成。输出 对于每个测试用例,输出在一行中具有最大权重的字符串。如果有多个答案,则输出最短的答案。如果仍有多个答案,则按字典顺序输出最小的答案。答案可能是一个空字符串。

时间: 2024-03-18 10:39:57 浏览: 15
下面是该问题的 C++ 代码实现: ```cpp #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 105; const int MAXL = 15; const int MAXLEN = 55; const int MAXW = 26; int T, N, M, w[MAXW], dp[MAXN][MAXLEN]; char s[MAXN][MAXLEN]; int main() { cin >> T; while (T--) { cin >> N >> M; for (int i = 1; i <= M; i++) { cin >> s[i] >> w[i]; } memset(dp, -1, sizeof(dp)); dp[0][0] = 0; for (int i = 1; i <= M; i++) { for (int j = N; j >= 0; j--) { for (int k = strlen(s[i]); k <= j; k++) { if (dp[j-k][0] != -1) { int val = dp[j-k][0] + w[i]; if (dp[j][0] < val || (dp[j][0] == val && strcmp(s[i], s[dp[j][1]]) < 0)) { dp[j][0] = val; dp[j][1] = i; } } } } } cout << s[dp[N][1]]; for (int i = 1; i < N - strlen(s[dp[N][1]]) + 1; i++) { cout << " " << s[dp[N][1]]; } cout << endl; } return 0; } ``` 该算法的基本思路是动态规划。首先,对于一个长度为 $j$ 的字符串,我们需要求出由给定单词组成的字符串,使得其权值最大。设 $dp[j]$ 表示长度为 $j$ 的字符串的最大权值,$dp[j][0]$ 表示最大权值,$dp[j][1]$ 表示使用的最后一个单词的编号。初始时,$dp[0][0]$ 为 0。 接下来,我们按照单词的顺序,依次考虑每个单词。对于第 $i$ 个单词,我们需要考虑它是否能够被加入到字符串中。因此,我们需要枚举当前字符串长度 $j$,并在其中寻找一个位置 $k$,使得该单词可以被加入到字符串中。具体地,我们需要满足 $k \geqslant |W_i|$,且 $dp[j-k]$ 不为 -1(即 $j-k$ 这个长度的字符串可以由给定单词组成)。如果满足这两个条件,我们可以尝试将该单词加入到字符串中,计算新的权值 $val = dp[j-k][0] + w[i]$,并与 $dp[j][0]$ 进行比较。如果 $val$ 更大,或者 $val$ 相等但单词 $W_i$ 的字典序更小,我们就更新 $dp[j][0]$ 和 $dp[j][1]$。 最终,我们可以输出长度为 $N$ 的字符串的最大权值,即 $dp[N][0]$ 对应的单词 $W_{dp[N][1]}$,并将它输出 $N/|W_{dp[N][1]}|$ 次,即可得到最终的答案。

相关推荐

最新推荐

recommend-type

详解C++ string常用截取字符串方法

string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); find_last_of(string strSub, npos); 其中strSub是需要寻找的子字符串,npos为查找起始位置。找到返回子...
recommend-type

C++实现数字转换为十六进制字符串的方法

主要介绍了C++实现数字转换为十六进制字符串的方法,涉及C++操作数字与字符串转换的相关技巧,需要的朋友可以参考下
recommend-type

C++实现判断字符串是否回文实例解析

主要介绍了C++实现判断字符串是否回文,其中采用了数据结构中栈以及过滤字符等技术,,需要的朋友可以参考下
recommend-type

C++中用栈来判断括号字符串匹配问题的实现方法

主要介绍了C++中用栈来判断括号字符串匹配问题的实现方法,是一个比较实用的算法技巧,包含了关于栈的基本操作,需要的朋友可以参考下
recommend-type

C++不使用变量求字符串长度strlen函数的实现方法

主要介绍了C++不使用变量求字符串长度strlen函数的实现方法,实例分析了strlen函数的实现原理与不使用变量求字符串长度的实现技巧,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解答下列问题:S—>S;T|T;T—>a 构造任意项目集规范族,构造LR(0)分析表,并分析a;a

对于这个文法,我们可以构造以下项目集规范族: I0: S -> .S S -> .T T -> .a I1: S -> S. [$ T -> T. [$ I2: S -> T. I3: S -> S.;S S -> S.;T T -> T.;a 其中,点(.)表示已经被扫描过的符号,;$表示输入串的结束符号。 根据项目集规范族,我们可以构造出LR(0)分析表: 状态 | a | $ ---- | - | - I0 | s3| I1 | |acc I2 | | 其中s3表示移进到状态3,acc表示接受。在分析字符串a;a时,我们可以按照以下步骤进行
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。