單詞的劃分 codevs1779**gold
題目描述 description
problem有乙個很長的由小寫字母組成字串。為了便於對這個字串進行分析,需要將它劃分成若干個部分,每個部分稱為乙個單詞。出於減少分析量的目的,我們希望劃分出的單詞數越少越好。output乙個整數,表示字串可以被劃分成的最少的單詞數。
輸入描述 input description
從文字檔案word.in中讀入資料。第一行,乙個字串。(字串的長度不超過100),第二行乙個整數n,表示單詞的個數。(n<=100),第3~n+2行,每行列出乙個單詞。
輸出描述 output description
乙個整數,表示字串可以被劃分成的最少的單詞數。
樣例輸入 sample input
realityour
5real
reality
ityour
our
樣例輸出 sample output 2
資料範圍及提示 data size & hint
(原字串可拆成real+it+your或reality+our,由於reality+our僅為兩個部分,因此最優解為2,另外注意,單詞列表中的每個單詞都可以重複使用多次,也可以不用)
【解題思路:dp】
f[i]表示這個字串的前i個字母最少可以劃分成多少個單詞;
那麼第一層迴圈以下strlen(s),指標也就是字串中從頭到尾每乙個字母;
第二層迴圈列舉每乙個單詞,然後比較以下當前掃到的字串的結尾是不是那個單詞,如果是的話,那麼f[i]=max(f[i],f[i-strlen(a[j])]+1);
很好理解。。
【**】
#include#include#includeusing namespace std;
char s[200],word[105][200];
int s1,i,j,n;
int l[105],f[105];
int ok(int x,int y)//逐位比較
memset(f,127/3,sizeof(f));
f[0]=0;
for (i=0;i=l[j])//字串讀進來的時候首位下標是0,所以i需要+1
if (ok(i-l[j]+1,j))
f[i+1]=min(f[i+1],f[i-l[j]+1]+1);
printf("%d",f[s1]);
return 0;
}
【我是迫不得已採用的cin,codevs上不知道為什麼不識別gets】 單詞的劃分
單詞的劃分 time limit 1s memory limit 1000k total submit 2558 accepted 1134 有乙個很長的由小寫字母組成字串。為了便於對這個字串進行分析,需要將它劃分成若干個部分,每個部分稱為乙個單詞。出於減少分析量的目的,我們希望劃分出的單詞數越少越...
單詞的劃分
有乙個很長的由小寫字母組成的字串。為了便於對這個字串進行分析,需要將它劃分成若干部分,每部分稱為乙個單詞。出於減少分析量的目的,希望劃分出的單詞數越少越好。第1行1個字串,長度不超過100。第2行1個整數n,表示單詞的個數,n 100。第3 n 2行,每行列出1個單詞。一行乙個正整數,表示字串可以被...
DP 單詞的劃分
題目描述 有乙個很長的由小寫字母組成字串。為了便於對這個字串進行分析,需要將它劃分成若干個部分,每個部分稱為乙個單詞。出於減少分析量的目的,我們希望劃分出的單詞數越少越好。你就是來完成這一劃分工作的。輸入 第一行,乙個字串。字串的長度不超過300 第二行乙個整數n,表示單詞的個數。n 100 第3 ...