
P1026 统计单词个数&&SSL1017
发布日期:2021-05-07 09:38:35
浏览次数:13
分类:精选文章
本文共 2124 字,大约阅读时间需要 7 分钟。
要解决这个问题,我们可以使用动态规划方法来确定如何将给定字符串分成k个部分,使得每个部分包含的单词数量总和最大。每个单词必须来自给定的字典,并且一旦选择了一个单词,其第一个字母不能再用于其他单词。
方法思路
问题分析:
- 给定一个由小写字母组成的长字符串,需要将其分成k个部分。
- 每个部分中的单词必须来自给定的字典,且每个单词的第一个字母不能重复使用。
动态规划方法:
- 定义状态f[i][j]表示前i个行分成j个部分的单词数量最大值。
- 使用递推公式f[i][j] = max(f[u][j-1] + count[u+1][i]),其中u从1到i-1,count[u+1][i]表示从u+1到i的位置之间能组成多少个单词。
预处理和辅助数组:
- 预处理一个辅助数组
w
,其中w[x][y]表示从位置x开始的字符串中是否能找到一个单词,且该单词的第一个字母未被使用过。
动态规划填充:
- 初始化f[i][j]数组,逐步填充每个状态,考虑是否能够分割前i行为j个部分,并且每部分有最多的单词数量。
解决代码
def main(): import sys input = sys.stdin.read().split() idx = 0 p = int(input[idx]) idx += 1 k = int(input[idx]) idx += 1 s = 20 * p string = ''.join(input[idx:idx + s]) idx += s s = int(input[idx]) idx += 1 words = [] for _ in range(s): words.append(input[idx]) idx += 1 # 预处理w数组 w = [[False] * (s + 1) for _ in range(s + 1)] for i in range(1, s + 1): for l in range(1, min(20, s - i + 1)): substr = string[i - 1:i - 1 + l] for word in words: if substr == word and string[i - 1] not in w[i][i + l - 1]: w[i][i + l - 1] = True break # 初始化动态规划数组 dp = [[0] * (k + 1) for _ in range(s + 1)] for i in range(1, s + 1): dp[i][1] = dp[i - 1][1] + (1 if w[i][i] else 0) for j in range(2, k + 1): for i in range(1, s + 1): max_val = 0 for u in range(0, i): if dp[u][j - 1] == 0: continue start = u + 1 end = i count = 0 used = set() for m in range(start, end + 1): if m == start: used.add(string[m - 1]) if w[m][m + l - 1] for l in ...: count +=1 if count > max_val: max_val = dp[u][j - 1] + count dp[i][j] = max_val print(dp[s][k])if __name__ == "__main__": main()
代码解释
- 输入处理:读取输入数据,包括字符串和字典。
- 预处理辅助数组:创建一个二维数组
w
,用于记录每个位置是否能组成一个单词。 - 动态规划初始化:初始化动态规划数组
dp
,记录前i个行分成j个部分的最大单词数量。 - 动态规划填充:逐步填充每个状态,考虑是否能够分割前i行为j个部分,并且每部分有最多的单词数量。
- 输出结果:打印最终结果,即分割成k个部分的最大单词数量。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月13日 18时09分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JDK 内置的多线程协作工具类的使用场景
2019-03-05
Java 中哪些对象可以获取类对象
2019-03-05
11.2.6 时间值的小数秒
2019-03-05
Redis源码分析(七)--- zipmap压缩图
2019-03-05
自定义Hive Sql Job分析工具
2019-03-05
【MySQL】(九)触发器
2019-03-05
Oracle 11G环境配置
2019-03-05
【Python】(十二)IO 文件处理
2019-03-05
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
2019-03-05
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
2019-03-05
C语言的数值溢出问题(上)
2019-03-05
函数指针的典型应用-计算函数的定积分(矩形法思想)
2019-03-05
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
2019-03-05
用 wxPython 打印你的 App
2019-03-05
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
2019-03-05
android:使用audiotrack 类播放wav文件
2019-03-05
聊聊我的五一小假期
2019-03-05