华师一附中OI组
标题:
单词的划分
[打印本页]
作者:
admin
时间:
2018-6-3 11:43
标题:
单词的划分
有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。
输入格式
从文本文件word.in中读入数据。
第一行,一个字符串。(字符串的长度不超过100)
第二行一个整数n,表示单词的个数。(n<=100)
第3~n+2行,每行列出一个单词。
输出格式
一个整数,表示字符串可以被划分成的最少的单词数。
样例输入
realityour
5
real
reality
it
your
our
样例输出
2
(原字符串可拆成real+it+your或reality+our,由于reality+our仅为两个部分,因此最优解为2,另外注意,单词列表中的每个单词都可以重复使用多次,也可以不用)
作者:
YTC
时间:
2018-6-3 16:01
#include<iostream>
#include<cstdio>
using namespace std;
string ss;
string s[101];
int n;
int f[105];
bool judge(int l,string s)
{
if(ss.size()-l<s.size()) return false;
for(int i=l;i<l+s.size();i++)
if(ss[i]!=s[i-l]) return false;
return true;
}
int dfs(int p)
{
if(f[p]) return f[p];
if(p>=ss.size()) return 0;
int ans=999999;
for(int i=1;i<=n;i++)
if(judge(p,s[i])) ans=min(dfs(p+s[i].size())+1,ans);
return f[p]=ans;
}
int main()
{
freopen("word.in","r",stdin);
freopen("word.out","w",stdout);
cin>>ss;
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
dfs(0);
cout<<f[0];
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2