| | | | 描述 Description | | | 有一个很长的由小写字母组成字符串。为了便于对这个字符串进行分析,需要将它划分成若干个部分,每个部分称为一个单词。出于减少分析量的目的,我们希望划分出的单词数越少越好。你就是来完成这一划分工作的。 | | | |
| | | | 输入格式 Input Format | | | 从文本文件word.in中读入数据。 第一行,一个字符串。(字符串的长度不超过100) 第二行一个整数n,表示单词的个数。(n<=100) 第3~n+2行,每行列出一个单词。
| | | |
| | | | 输出格式 Output Format | | | 一个整数,表示字符串可以被划分成的最少的单词数。 | | | |
| | | | 时间限制 Time Limitation | | | 各个测试点1s
| | | |
| | | | 注释 Hint | | | (原字符串可拆成real+it+your或reality+our,由于reality+our仅为两个部分,因此最优解为2,另外注意,单词列表中的每个单词都可以重复使用多次,也可以不用) | |
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
using namespace std;
int main()
{
string str;
int n;
string a[101];
int dp[110];//dp[i]表示str到第i个字母的时候由最少的单词组成的单词个数
while(cin>>str)
{
scanf("%d",&n);
for(int i=0;i<n;i++) cin>>a[i];
memset(dp,10,sizeof(dp));dp[0]=0;
int len=str.size();
for(int i=0;i<len;i++)
{
int k=i+1;
for(int j=0;j<n;j++)
{
if(a[j].size()>k) continue;
int flag=1;
for(int l=a[j].size()-1,p=i;l>=0;l--,p--)
{
if(str[p]!=a[j][l])
{
flag=0;
break;
}
}
if(flag) dp[k]=min(dp[k],dp[k-a[j].size()]+1);
}
}
printf("%d/n",dp[len]);
}
return 0;
}