codevs1779 單詞的劃分 解題報告

2021-07-04 19:18:11 字數 1307 閱讀 2547

單詞的劃分  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 ...