【洛谷1026】【NOIP2001】统计单词个数
题面
题目描述
给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个)。要求将此字母串分成k份(1<k<=40),且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当选用一个单词之后,其第一个字母不能再用。例如字符串this中可包含this和is,选用this之后就不能包含th)。
单词在给出的一个不超过6个单词的字典中。
要求输出最大的个数。
输入格式:
每组的第一行有二个正整数(p,k)
p表示字串的行数;
k表示分为k个部分。
接下来的p行,每行均有20个字符。
再接下来有一个正整数s,表示字典中单词个数。(1<=s<=6)
接下来的s行,每行均有一个单词。
输出格式:
一个整数,分别对应每组测试数据的相应结果。
输入输出样例
输入样例#1:
1 3
thisisabookyouareaoh
4
is
a
ok
sab
输出样例#1:
7
说明
this/isabookyoua/reaoh
题解
这是一道很容(keng)易(die)的DP题
我表示什么也不想说
f[i][j]表示前i个字符分成j份的最大单词数
那么,我们不难退出递推关系式
f[i][j]=max{f[k][j-1]+w[k+1][j]}(k< i)
其中w[i][j]表示i到j的单词数
现在的问题就是如何求出w的值
方法很多
直接暴力就可以了
注意!暴力请不要使用substr截出子串再来判断,否则会超时
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
//f[i][j]表示前i个字母分成j段能够得到的最大单词个数
//f[i][j]=max{f[k][j-1]+num[k+1][i]}
//num[i][j]表示i到j的单词个数
string ss;
string s;
int f[210][210],w[210][210];
int num[210][210];
bool vis[210];
string a[20];
int b[210];
int n,p,k,l;
inline bool cmp(string a,string b)
{
return a.length()<b.length();
}
int Count(string ss)
{
int tot=0;
int ll=ss.length();
bool fl=false;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i)//枚举字典
{
for(int j=0;j<=ll-b[i];++j)//枚举字符串
if(!vis[j])
{
fl=false;
for(int k=0;k<b[i];++k)
if(a[i][k]!=ss[k+j])
{
fl=true;
break;
}
if(!fl)
{
++tot;
vis[j]=true;
}
}
}
return tot;
}
int main()
{
cin>>p>>k;
for(int i=1;i<=p;++i)
{
cin>>ss;
s=s+ss;
}
cin>>n;
l=s.length();
for(int i=1;i<=n;++i)
cin>>a[i];
sort(&a[1],&a[n+1],cmp);
for(int i=1;i<=n;++i)
b[i]=a[i].length();
for(int i=0;i<l;++i)
{
ss="";
for(int j=i;j<l;++j)
{
ss+=s[j];
w[i][j]=Count(ss);
}
}
for(int i=0;i<l;++i)
f[i][1]=w[0][i];
//cout<<"K="<<k<<endl;
for(int i=0;i<l;++i)
for(int j=2;j<=min(i+1,k);++j)
for(int z=j-1;z<i;++z)
f[i][j]=max(f[z][j-1]+w[z+1][i],f[i][j]);
cout<<f[l-1][k]<<endl;
return 0;
}
【洛谷1026】【NOIP2001】统计单词个数的更多相关文章
- NOIP2001 统计单词个数
题三 统计单词个数(30分) 问题描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k&l ...
- NOIP2001统计单词个数[序列DP]
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- 【洛谷】P1308 统计单词数-全AC题解(易理解
弟弟的混乱代码(易理解 大概 思路: 循环b(被找的字符串),遇空格比较两空格间的长度是否与a(需要查找的字符)相等:不相等继续循环:相等比较内容是否相同(倒数比较,不一样直接退出 ,直到比较到第一个 ...
- Codevs_1040_[NOIP2001]_统计单词个数_(划分型动态规划)
描述 http://codevs.cn/problem/1040/ 与Codevs_1017_乘积最大很像,都是划分型dp. 给出一个字符串和几个单词,要求将字符串划分成k段,在每一段中求共有多少单词 ...
- [洛谷U40581]树上统计treecnt
[洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...
- 第六章 第一个Linux驱动程序:统计单词个数
现在进入了实战阶段,使用统计单词个数的实例让我们了解开发和测试Linux驱动程序的完整过程.第一个Linux驱动程序是统计单词个数. 这个Linux驱动程序没有访问硬件,而是利用设备文件作为介质与应用 ...
- 第六章第一个linux个程序:统计单词个数
第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数. 第 1 步:建立 Linu x 驱 ...
- NOIP200107统计单词个数
NOIP200107统计单词个数 难度级别: A: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 给出一个长度不超过200的由 ...
- luogu P1026 统计单词个数
题目链接 luogu P1026 统计单词个数 题解 贪心的预处理母本串从i到j的最大单词数 然后dp[i][j] 表示从前i个切了k次最优解 转移显然 代码 #include<cstdio&g ...
- Codevs 1040 统计单词个数
1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给出一个长度不超过200的 ...
随机推荐
- 2个域名重定向到https域名
配置实例: [root@iZbp17q09o7e8pgg9dybd7Z conf.d]# cat company.confserver { listen 80; server_name www.yu* ...
- 关于 iOS 分类(Category)的实现代码
其实质是对一个类的扩充,对类扩充的方法有两种: (1)通过继承(经常用到) (2)通过分类 一个已知类Name 其头文件Name.h #import <Foundation/Foundation ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- c++ 回调函数使用
普通回调 #include<stdio.h> void printWelcome(int len) { printf("welcome -- %d\n", len); ...
- 发布iOS应用时,Xcode报错:Application failed codesign verification.
如下图,在发布应用时,因为codesign问题卡住了.尝试修改Target中的code sign setting,没有效果. 接着,在Developer Center删除所有证书,甚至包括Apps I ...
- Minikube之Win10单机部署
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作.如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes ...
- Docker系列一:Docker基本概念及指令介绍
1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用 ...
- SQL Server查询中对于单列数据','分割的数据进行的拆分操作,集合的每一个行变多行
1.cross apply cross apply 我们可以把它看作成是inner join 来使用 2.outer apply outer apply我们可以把它看做是left join 来使用 注 ...
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- 用DirectDraw封装的位图动画类
头文件 [cpp] view plaincopyprint? #pragma once #include <vector> using namespace std; #include &l ...