codevs 1779 单词的划分
生活随笔
收集整理的這篇文章主要介紹了
codevs 1779 单词的划分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1779 單詞的劃分
?時間限制: 1 s
?空間限制: 128000 KB ?題目等級 : 黃金 Gold 題目描述?DescriptionProblem有一個很長的由小寫字母組成字符串。為了便于對這個字符串進行分析,需要將它劃分成若干個部分,每個部分稱為一個單詞。出于減少分析量的目的,我們希望劃分出的單詞數越少越好。Output一個整數,表示字符串可以被劃分成的最少的單詞數。
- 應該加上一個前提題目中提供的字符串肯定能被劃分,否則輸出增加判斷語句。
?從文本文件word.in中讀入數據。第一行,一個字符串。(字符串的長度不超過100),第二行一個整數n,表示單詞的個數。(n<=100),第3~n+2行,每行列出一個單詞。
輸出描述?Output Description?一個整數,表示字符串可以被劃分成的最少的單詞數。
樣例輸入?Sample Inputrealityour
5
real
reality
it
your
our
2
數據范圍及提示?Data Size & Hint(原字符串可拆成real+it+your或reality+our,由于reality+our僅為兩個部分,因此最優解為2,另外注意,單詞列表中的每個單詞都可以重復使用多次,也可以不用)
?
1 /*基本思路:p[i][j]數組儲存著從i--j這個區間內,能不能劃分為一個單詞,是1,否則一個大數 2 DP方程:f[i]=min(f[i],f[t]+p[t+1][i]);f[i]儲存著到1---i為止可以 劃分的單詞的最小數目, 3 t從0到i--1枚舉,f[t]前t位,p數組表示吧t+1--i當做一個單詞 4 5 注意:substr函數的使用a.substr(i,l),表示把a字符串從第i位開始,切割l位形成的一個字符串 6 */ 7 #include<iostream> 8 using namespace std; 9 #include<cstdio> 10 #include<string> 11 #include<cstring> 12 #define N 101 13 int p[N][N],f[N],lena; 14 string a,b[N]; 15 int n; 16 void input() 17 { 18 cin>>a; 19 scanf("%d",&n); 20 for(int i=1;i<=n;++i) 21 cin>>b[i]; 22 } 23 void ZB() 24 { 25 /* memset(p,99,sizeof(p));這一句賦值超大數是不對的,DP方程中會使int類型越界,所以題目中賦值最大根據題意,不要出現越界的情況,這個題p[][]=1000就足夠大了*/ 26 lena=a.length(); 27 for(int i=0;i<lena;++i) 28 for(int j=i;j<lena;++j) 29 { 30 int l=j-i+1; 31 for(int k=1;k<=n;++k) 32 if(a.substr(i,l)==b[k]) 33 { 34 p[i][j]=1; 35 break; 36 } 37 else { 38 p[i][j]=1001; 39 } 40 } 41 } 42 void DP() 43 { 44 for(int i=0;i<lena;++i) 45 f[i]=p[0][i]; 46 for(int i=1;i<lena;++i) 47 for(int t=0;t<=i-1;++t) 48 f[i]=min(f[i],f[t]+p[t+1][i]); 49 } 50 int main() 51 { 52 input(); 53 ZB(); 54 DP(); 55 cout<<f[lena-1]; 56 return 0; 57 } View Code?
轉載于:https://www.cnblogs.com/c1299401227/p/5313587.html
總結
以上是生活随笔為你收集整理的codevs 1779 单词的划分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Deep learning:五(regu
- 下一篇: ios 图片截取功能 图片拼接功能