博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu1026 统计单词个数
阅读量:5250 次
发布时间:2019-06-14

本文共 1382 字,大约阅读时间需要 4 分钟。

题目大意

  给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1< k< =40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。

思路

#include 
#include
#include
#include
#include
using namespace std;const int MAX_LEN = 210, MAX_K = 45, MAX_WORD_CNT = 10, MINF = 0xcfcfcfcf;int W[MAX_LEN][MAX_LEN], F[MAX_LEN][MAX_K];string S, P[MAX_WORD_CNT];int PCnt, K;void Read(){ int lineCnt; cin >> lineCnt >> K; string temp; for (int i = 0; i < lineCnt; i++) { cin >> temp; S += temp; } cin >> PCnt; for (int i = 0; i < PCnt; i++) cin >> P[i];}void GetW(){ for (int j = 0; j < S.length(); j++) for (int i = j; i >= 0; i--) { int prevVal = i == j ? 0 : W[i + 1][j]; W[i][j] = prevVal; for (int p = 0; p < PCnt; p++) if (j - i + 1 >= P[p].length() && S.substr(i, P[p].length()) == P[p]) W[i][j] = prevVal + 1; }}int GetAns(){ memset(F, MINF, sizeof(F)); for (int i = 0; i < S.length(); i++) F[i][1] = W[0][i]; for (int i = 0; i < S.length(); i++) for (int k = 2; k <= K; k++) for (int l = 0; l < i; l++) F[i][k] = max(F[i][k], F[l][k - 1] + W[l + 1][i]); return F[S.length() - 1][K];}int main(){ Read(); GetW(); printf("%d\n", GetAns()); return 0;}

  

转载于:https://www.cnblogs.com/headboy2002/p/9542272.html

你可能感兴趣的文章
Linux系统中用户身份与文件权限
查看>>
django rest_framework中将json输出字符强制为utf-8编码
查看>>
.12-浅析webpack源码之NodeWatchFileSystem模块总览
查看>>
es6(三set和map数据结构)
查看>>
从零开始打造我的计算机系统【运行效果】
查看>>
hdu 2085 核反应堆
查看>>
201671010127 2016—2017-2 通过一个小程序对Java的再认识。
查看>>
SQL函数--- SQL MAX()
查看>>
C#委托-委托作为方法的参数
查看>>
VUE实例
查看>>
2019-4-8 zookeeper学习笔记
查看>>
Eclipse shift + ctrl + F 不好用
查看>>
python发送各类邮件的主要方法
查看>>
解决JQUERY $符号的冲突
查看>>
HBase入门基础教程 HBase之单机模式与伪分布式模式安装
查看>>
ArrayList和LinkedList
查看>>
annotatedClasses和component-scan冲突吗
查看>>
eclipse 代码中突然出现特殊字符
查看>>
【leetcode 简单】 第七题 合并两个有序链表
查看>>
asp.net core 微信扫码支付(扫码支付,H5支付,公众号支付,app支付)之1
查看>>