給出乙個長度不超過 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行,...