dp,.单词的划分
有一个很长的由小写字母组成的字符串。为了便于对这个字符串进行分析,需要将它划分成若干部分,每部分称为一个单词。出于减少分析量的目的,希望划分出的单词数越少越好。 你就是来完成这一划分工作的。
Input
第1行1个字符串,长度不超过1000。
第2行1个整数nn,表示单词的个数,n≤100n≤100。
第3~n+2n+2行,每行列出1个单词
Output
一个整数,表示字符串可以被划分成的最少的单词数。
Samples
Source
石光中学 FCS2018基础班day7
f[i]表示这个字符串的前i个字母最少可以划分成多少个单词;
那么第一层循环以下strlen(s),指针也就是字符串中从头到尾每一个字母;
第二层循环枚举每一个单词,然后比较以下当前扫到的字符串的结尾是不是那个单词,如果是的话,那么f[i]=max(f[i],f[i-strlen(a[j])]+1);
#include<iostream> #include<algorithm> #include<cstring> const int inf=0x3f3f3f3f; using namespace std; const int maxn=1e5+100; string s; string word[maxn]; int f[maxn]; int n; void inint(){ cin>>s; cin>>n; for(int i=1;i<=n;i++){ cin>>word[i]; } memset(f,inf,sizeof(f)); } int main(){ inint(); f[0]=0; for(int i=0;i<s.size();i++){ for(int j=1;j<=n;j++){ if(i+1>=word[j].size()){ string z1=s.substr(i-word[j].size()+1,word[j].size()); if(z1==word[j]){ f[i+1]=min(f[i+1],f[i-word[j].size()+1]+1); //cout<<z1<<" dkl "<<word[j]<<" "<<i+1<<" "<<i-word[j].size()+1<<endl; } } } } cout<<f[s.size()]<<endl; }