【洛谷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的 ...
随机推荐
- zabbix如何监控进程
zabbix中item的配置如下: zabbix中trigger的配置如下:
- 大型互联网公司Java开发岗位面试题归类!
一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯.. ...
- 我的2017年终总结(PF项目框架设计心得分享 1.0rc new)
一晃眼又过去了一年,在这一年里尽管有许多不如意的事,却阻挡不了我前进的脚步.先用一句话来总结去年一年的状态,那就是“无休无止的忙碌”.而这样的忙碌状态对我来说是不可取的,因为匮乏的忙碌只能让头脑处于一 ...
- ajax请求中contentType与dataType区别
contentType: 告诉服务器,我要发什么类型的数据,默认值: "application/x-www-form-urlencoded". dataType:告诉服务器,我要想 ...
- 使用EL表达式调用java方法
首先,新建一个类,类中写一个静态方法 public class PrivilegeUtils { public static Boolean checkPrivilegeByName(User use ...
- ubuntu python3.6 找不到_sqlite3
sudo apt-get install libsqlite3-dev 然后重新编译python: sudo ./configure --with-ssl sudo make -j8 sudo mak ...
- java6 - 面向对象编程思想
一.学习大纲: 1. 类的理解:对现实事物的抽象表示 2. 行为与特征的理解:在类抽象过程中,通常把行为抽象成方法,把特征抽象成属性 3. 对象的理解:类的一个实例即是对象 4. Object 根类 ...
- Yii2 场景
下面给大家介绍一下 yii2.0 场景的使用. 现在在 post表里面有 title image content 三个的字段,当我创建一个 post 的时候,我想三个字段全部是必填项,但是你修改的时候 ...
- 【BZOJ2127】happiness
Time Limit: 1000 ms Memory Limit: 256 MB Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为 ...
- android/底层获取上下文对象
public class ContextUtils { private static Context applicationContext = null; public static Context ...