博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【9933】单词的划分
阅读量:4618 次
发布时间:2019-06-09

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

Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。

出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。
(原字符串可拆成real+it+your或reality+our,由于reality+our仅为两个部分,因此最优解为2,另外注意,单词列表中的每个单
词都可以重复使用多次,也可以不用)
【输入格式】

从文本文件word.in中读入数据。

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

【输出格式】

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

Sample Input

realityour

5
real
reality
it
your
our

Sample Output

2

【题目链接】:

【题解】

记忆化搜搜搞一波;
用f[i][j]表示i..j这个区间里的单词最少能被分成几个单词;(如果为INF表示不合法);
如果i==j;
则判断s[i]在不在字典中;如果在返回1;否则返回INF;
如果i小于j
则判断子串s[i..j]在不在字典中;在的话返回1;
否则枚举断点k,递归划分;
【完整代码】

#include 
#include
#include
#include
#include
using namespace std;const int MAXN = 110;const int INF = 0x3f3f3f3f;map
dic;string s;int n;int f[MAXN][MAXN];int get_ans(int l,int r){ if (f[l][r]!=INF) return f[l][r]; if (l==r) if (dic[s.substr(l,1)]) return f[l][r] = 1; if (dic[s.substr(l,r-l+1)]) return f[l][r] = 1; for (int i = l;i <= r-1;i++) f[l][r] = min(f[l][r],get_ans(l,i)+get_ans(i+1,r)); return f[l][r];}int main(){ //freopen("F:\\rush.txt","r",stdin); cin >> s; cin >> n; for (int i = 1;i <= n;i++) { string temps; cin >> temps; dic[temps] = true; } memset(f,INF,sizeof(f)); printf("%d\n",get_ans(0,s.size()-1)); return 0;}

转载于:https://www.cnblogs.com/AWCXV/p/7626965.html

你可能感兴趣的文章
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>
关于 IOS 发布的点点滴滴记录(一)
查看>>
《EMCAScript6入门》读书笔记——14.Promise对象
查看>>
CSS——水平/垂直居中
查看>>
Eclipse连接mysql数据库jdbc下载(图文)
查看>>
Python中Selenium的使用方法
查看>>
三月23日测试Fiddler
查看>>
20171013_数据库新环境后期操作
查看>>
poj 1654 && poj 1675
查看>>
运维派 企业面试题1 监控MySQL主从同步是否异常
查看>>
Docker 版本
查看>>
poj 1753 Flip Game
查看>>
在深信服实习是怎样的体验(研发测试岗)
查看>>
Linux免密码登陆
查看>>
SpringMVC中文件的上传(上传到服务器)和下载问题(二)--------下载
查看>>
Socket & TCP &HTTP
查看>>
osip及eXosip的编译方法
查看>>
Hibernate composite key
查看>>
[CF Round #294 div2] D. A and B and Interesting Substrings 【Map】
查看>>