1779 单词的划分

时间限制: 1 s

 空间限制: 128000 KB
 题目等级 : 黄金 Gold
题目描述 Description

Problem有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。Output一个整数,表示字符串可以被划分成的最少的单词数。

  • 应该加上一个前提题目中提供的字符串肯定能被划分,否则输出增加判断语句。
输入描述 Input Description

从文本文件word.in中读入数据。第一行,一个字符串。(字符串的长度不超过100),第二行一个整数n,表示单词的个数。(n<=100),第3~n+2行,每行列出一个单词。

输出描述 Output Description

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

样例输入 Sample Input

realityour
5
real
reality
it
your
our

样例输出 Sample Output

2

数据范围及提示 Data Size & Hint

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

 /*基本思路:p[i][j]数组储存着从i--j这个区间内,能不能划分为一个单词,是1,否则一个大数
DP方程:f[i]=min(f[i],f[t]+p[t+1][i]);f[i]储存着到1---i为止可以 划分的单词的最小数目,
t从0到i--1枚举,f[t]前t位,p数组表示吧t+1--i当做一个单词 注意:substr函数的使用a.substr(i,l),表示把a字符串从第i位开始,切割l位形成的一个字符串
*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<string>
#include<cstring>
#define N 101
int p[N][N],f[N],lena;
string a,b[N];
int n;
void input()
{
cin>>a;
scanf("%d",&n);
for(int i=;i<=n;++i)
cin>>b[i];
}
void ZB()
{
/* memset(p,99,sizeof(p));这一句赋值超大数是不对的,DP方程中会使int类型越界,所以题目中赋值最大根据题意,不要出现越界的情况,这个题p[][]=1000就足够大了*/
lena=a.length();
for(int i=;i<lena;++i)
for(int j=i;j<lena;++j)
{
int l=j-i+;
for(int k=;k<=n;++k)
if(a.substr(i,l)==b[k])
{
p[i][j]=;
break;
}
else {
p[i][j]=;
}
}
}
void DP()
{
for(int i=;i<lena;++i)
f[i]=p[][i];
for(int i=;i<lena;++i)
for(int t=;t<=i-;++t)
f[i]=min(f[i],f[t]+p[t+][i]);
}
int main()
{
input();
ZB();
DP();
cout<<f[lena-];
return ;
}
 

codevs 1779 单词的划分的更多相关文章

  1. codevs 1729 单词查找树

    二次联通门 : codevs 1729 单词查找树 /* codevs 1729 单词查找树 Trie树 统计节点个数 建一棵Trie树 插入单词时每新开一个节点就计数器加1 */ #include ...

  2. tyvj1102 单词的划分

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

  3. Codevs 1205 单词翻转

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来 输入 ...

  4. codevs 3013 单词背诵 hash

    题目链接 题目描述 Description 灵梦有n个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由m个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一 ...

  5. CODEVS 1205 单词反转

    嗯.... 这道题看起来挺像一个字符串的题,但其实却错了,它实质上却用了一个栈进行了一个模拟(当然还有一种鬼畜的做法,下面也会介绍到..... 首先先看题: 时间限制: 1 s 空间限制: 12800 ...

  6. Codevs 1018 单词接龙

    1018 单词接龙 2000年NOIP全国联赛普及组NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描 ...

  7. codevs——1039 数的划分

    1039 数的划分 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 将整数 ...

  8. luoguP1025+codevs 1039 数的划分 x

    luoguP1025 + codevs1039 数的划分 2001年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Des ...

  9. Codevs 1205 单词反转(Vector以及如何输出string)

    题意:倒序输出句子中的单词 代码: #include<cstdio> #include<iostream> #include<string> #include< ...

随机推荐

  1. Django rest framework + Vue简单示例

    构建vue项目参考这篇文章https://segmentfault.com/a/1190000008049815 一.创建Vue项目 修改源:npm config set registry https ...

  2. android 内核调试

    这篇文档给出使用android emulator 和 arm-linux-androideabi-gdb 调试 android kernel 的方法 1. checkout goldfish 源码: ...

  3. Laravel 5.2 整合 Uploadify 上传图片

    前端: <!-- 引入CSS.JS --> <link rel="stylesheet" type="text/css" href=" ...

  4. (十六)strtok、strtok_s、strtok_r 字符串分割函数

    1.strtok函数 函数原型:char * strtok (char *str, const char * delimiters); 参数:str,待分割的字符串(c-string):delimit ...

  5. WA时查错点

    这篇文章旨在总结可能出错的原因,想到时随时会补充. 查看调试输出语句是否删除 查看数组是否清零 查看是否使用long long 查看是否有的常量应开LL(如1LL << (32) ) 查看 ...

  6. ubuntu在vim编辑时,方向键无法正常使用

    /* 如果在普通用户下. */ [frankie@localhost ~]$ sudo apt-get install vim [frankie@localhost ~]$ cd /etc/vim [ ...

  7. 怎么删除Windows服务

    1,首先找到服务名字. 2,在cmd中进到c:下面 3,sc delete 名字. 删除成功

  8. POJ 2387 Til the Cows Come Home(dijkstra裸题)

    题目链接:http://poj.org/problem?id=2387 题目大意:给你t条边(无向图),n个顶点,让你求点1到点n的最短距离. 解题思路:裸的dijsktra,注意判重边. 代码: # ...

  9. LeetCode解题报告—— Regular Expression Matching

    Given an input string (s) and a pattern (p), implement regular expression matching with support for  ...

  10. asp.net的Server.MapPath方法

    Server.MapPath()的功能: 返回与 Web 服务器上的指定虚拟路径相对应的物理文件路径. 命名空间: System.Web 程序集: System.Web(在 System.Web.dl ...