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

【DP】单词的划分

题目描述

有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。

输入

第一行,一个字符串。(字符串的长度不超过100) 第二行一个整数n,表示单词的个数。(n<=100) 第3~n+2行,每行列出一个单词。

输出

一个整数,表示字符串可以被划分成的最少的单词数。

样例输入

realityour
5
real
reality
it
your
our

样例输出

2

提示

(原字符串可拆成real+it+your或reality+our,由于reality+our仅为两个部分,因此最优解为2,另外注意,单词列表中的 每个单词都可以重复使用多次也可以不用

思路:

我们设 dp(i)dp(i)dp(i) 表示原字符串的前 iii 个字符的单词最小划分总数
那么答案就是 dp(n)dp(n)dp(n) nnn原字符串的长度

初始化: dp(0)=0dp(0) = 0dp(0)=0 (因为一个单词也没有) [dp(1)[dp(1)[dp(1) ~ dp(n)]dp(n)]dp(n)] 为最大值
怎么转移呢?
对于每个长度,我们枚举所有的单词,我们可以使用 string 的 substr 函数求出末尾的字串,如果当前末尾的字串和当前枚举的单词可以对得上,那么我们就选这个单词
dp(i)=min⁡(dp(i),dp(i−len)+1)dp(i) = \min(dp(i), dp(i - len) + 1)dp(i)=min(dp(i),dp(ilen)+1)
否则我们就不动这个单词

最后输出 dp(n)dp(n)dp(n) 即可

代码

#include <iostream>
#include <string>
#include <vector>
#include <climits> // 使用INT_MAX
using namespace std;typedef string Word_t; // 定义Word_t为string类型
int main() {Word_t Ans_Cin;cin >> Ans_Cin; // 输入单词int n; // 单词个数cin >> n; // 输入单词个数vector<Word_t> words(n + 1); // 定义单词数组for (int i = 1; i <= n; ++i) cin >> words[i]; // 输入单词// dp第一步: 初始化vector<int> dp(Ans_Cin.size() + 1, INT_MAX - 10);dp[0] = 0;// dp第二步: 求解问题int Size = Ans_Cin.size(); // 长度for (int i = 1; i <= Size; i++){for (int j = 1; j <= n; j++){int len = words[j].size();if (i - len >= 0){string TempGetStr = Ans_Cin.substr(i - len, len); // 处理字符串if (TempGetStr == words[j]) // 如果相等dp[i] = min(dp[i], dp[i - len] + 1);}}}cout << dp[Size];return 0;
}

时间复杂度分析

状态总数为 O(nk)O(nk)O(nk) nnn 是字符串的长度,kkk 是单词个数
每次转移是 O(len)O(len)O(len) 的,lenlenlen 是单词的长度

所以时间复杂度是 O(nklen)O(nklen)O(nklen) 因为他们最大的值都是 100100100, 所以时间复杂度大约就是 O(n3)O(n^3)O(n3)
完全可以过

Tips: 机器每秒进行大约 10810^8108 次运算,在 n=100n=100n=100 的情况下,最大运算量大约是 O(100×100×100)O(100 \times 100 \times 100)O(100×100×100) 也就是 10610^6106 次运算,后者是前者的 100100100 倍,所以也是快的飞起,最大 1ms1ms1ms 跑完

http://www.lryc.cn/news/622798.html

相关文章:

  • 机器学习的特征工程(特征构造、特征选择、特征转换和特征提取)详解
  • MATLAB R2010b系统环境(二)MATLAB环境的准备
  • React手撕组件和Hooks总结
  • 自动化测试的下一站:AI缺陷检测工具如何实现“bug提前预警”?
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (3)
  • 知识点汇总linuxC高级 -2系统命令压缩与链接
  • 机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法
  • 022 基础 IO —— 文件
  • [系统架构设计师]系统质量属性与架构评估(八)
  • 【完整源码+数据集+部署教程】太阳能面板污垢检测系统源码和数据集:改进yolo11-RVB-EMA
  • Golang Seata 分布式事务方案详解
  • 正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
  • MySQL 从入门到精通 9:视图
  • 【lucene】SegmentInfos
  • 并查集理论基础, 107. 寻找存在的路径
  • 零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时
  • 生产环境Redis缓存穿透与雪崩防护性能优化实战指南
  • CSV 生成 Gantt 甘特图
  • 解锁JavaScript性能优化:从理论到实战
  • 【数据分享】上市公司供应链成本分摊数据(2007-2024)
  • Cursor执行命令卡顿解决办法(Cursor卡住、Cursor命令卡住、Cursor执行慢、Cursor执行命令慢)改成以管理员身份运行就好!!!
  • redis存储原理与对象模型
  • 数据结构初阶(16)排序算法——归并排序
  • FFmpeg QoS 处理
  • 《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境
  • 汽车行业供应链EDI标准体系解析:构建高效协同的数字桥梁
  • Blackwell 和 Hopper 架构的 GPGPU 新功能全面综述
  • 要导入StandardScaler类进行数据标准化,请使用以下语句:
  • 【计算机视觉与深度学习实战】03基于Canny、Sobel和Laplacian算子的边缘检测系统设计与实现
  • 常见的交叉编译工具链