洛谷P1026(統計單詞個數)

2021-10-09 01:14:23 字數 1995 閱讀 9522

給出乙個長度不超過 200 的由小寫英文本母組成的字母串(該字串以每行 20 個字母的方式輸入,且保證每行一定為 20 個)。要求將此字母串分成 k份,且每份中包含的單詞個數加起來總數最大。

每份中包含的單詞可以部分重疊。當選用乙個單詞之後,其第乙個字母不能再用。例如字串 this 中可包含 this 和 is,選用 this 之後就不能包含 th。

單詞在給出的乙個不超過 6 個單詞的字典中。

要求輸出最大的個數。

每組的第一行有兩個正整數 p,k。 p 表示字串的行數,k 表示分為 k 個部分。

接下來的 p 行,每行均有 20 個字元。

再接下來有乙個正整數 s,表示字典中單詞個數。 接下來的 s 行,每行均有乙個單詞。

1個整數,分別對應每組測試資料的相應結果。

這題用兩個動態規劃就可以解決了,我還多用了乙個滾動陣列。

第一步是輸入,這個是必須要做的,沒啥說的,輸入p,k。根據p按行輸入乙個字串str,然後 int len=str.size()一下,這個後面要用的,之後輸入s,再輸入乙個word陣列。

之後是預處理,用w[i][j]表示str從i到j中單詞個數。先構造出w[i][i],之後遞推式:w[i-1][j]=w[i][j],如果str中從i-1到j的子串中存在乙個單詞從i-1位置開始,那麼w[i-1][j]再加一。這裡可以用string類的find函式,返回值是0的話就加一。用f[i][j]表示把前i個字元分成j段最多的單詞個數,要先處理f[i][i],f[i

][i]

=∑k=

1iw[

k][k

]f[i][i]=\sum_^w[k][k]

f[i][i

]=∑k

=1i​

w[k]

[k],之後就是乙個遞推式f[i][j]=max(f[i][j],f[r][j-1]+w[r+1][i]),這裡的r滿足(j−

1)≤r

≤(i−

1)

(j-1)\le r\le (i-1)

(j−1)≤

r≤(i

−1)。

最後一步就是輸出,輸出f[len][k]就好了。

為什麼要用到滾動陣列呢,請看f陣列部分,第k列只與第k-1列有關,同理,第k-1列只與第k-2列有關···那麼我們就可以建立乙個滾動陣列,同時有個小技巧,f陣列的第k列我們只取了f[len][k],其它都是沒用的,所以我們滾動陣列處理的時候只要處理到k-1步就可以了,第k簡化成只求乙個數了。

talking is cheap,show you my code.

#include

#include

#include

using

namespace std;

string str ="";

int p, k, s;

string word[6]

;int w[

202]

[202];

int f[

202][2

];intcheck

(string st)

}return0;

}int

main()

cin >> s;

for(

int i =

0;i < s;i++

)int len = str.

size()

;for

(int i =

1;i <= len;i++)}

bool b =0;

for(

int i =

1;i <= len;i++

)for

(int cs =

2;cs < k;cs++)}

b =!b;}

int ans =0;

for(

int i =

(k -1)

;i < len;i++

) cout << ans << endl;

return0;

}

洛谷 P1026 統計單詞個數

題目描述 給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1 k 40 且每份中包含的單詞個數加起來總數最大 每份中包含的單詞可以部分重疊。當選用乙個單詞之後,其第乙個字母不能再用。例如字串this中可包含...

統計單詞個數 洛谷p1026

給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1單詞在給出的乙個不超過6個單詞的字典中。要求輸出最大的個數。輸入格式 每組的第一行有二個正整數 p,k p表示字串的行數 k表示分為k個部分。接下來的p行,...

洛谷 P1026 統計單詞個數

給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1單詞在給出的乙個不超過6個單詞的字典中。要求輸出最大的個數。輸入格式 每組的第一行有2個正整數 p,k p表示字串的行數,k表示分為k個部分。接下來的p行,...