題目描述
給出乙個長度不超過 200
20020
0 的由小寫英文本母組成的字母串(該字串以每行 20
2020
個字母的方式輸入,且保證每行一定為 20
2020
個)。要求將此字母串分成 k
kk 份,且每份中包含的單詞個數加起來總數最大。
每份中包含的單詞可以部分重疊。當選用乙個單詞之後,其第乙個字母不能再用。例如字串this
中可包含this
和is
,選用this
之後就不能包含th
。
單詞在給出的乙個不超過 6
66 個單詞的字典中。
要求輸出最大的個數。
輸入格式
每組的第一行有兩個正整數 p,k
p,kp,
k。 p
pp 表示字串的行數,k
kk 表示分為 k
kk 個部分。
接下來的 p
pp 行,每行均有 20
2020
個字元。
再接下來有乙個正整數 s
ss,表示字典中單詞個數。 接下來的 s
ss 行,每行均有乙個單詞。
輸出格式
1
11個整數,分別對應每組測試資料的相應結果。
輸入輸出樣例
輸入 #1 複製
1
3thisisabookyouareaoh4is
aoksab
輸出 #1 複製7
說明/提示
【資料範圍】
對於 100
%100\%
100%
的資料,2≤k
≤40
2 \le k \le 40
2≤k≤40
,1 ≤s
≤6
1 \le s \le 6
1≤s≤6。
【樣例解釋】
劃分方案為 thi
s/is
aboo
kyou
a/re
ao
hthis / isabookyoua / reaoh
this/i
sabo
okyo
ua/r
eaoh
首先,這是一道有點難度的動態規劃。
用 f i,
jf_
fi,j
表示 從尾巴用了 i
ii 個字元分了 j
jj 段的最多有多少個單詞。
則轉移方程不難想到:
f i,
j=ma
x(fi
,j,f
l,j−
1+su
ml+1
,i
)f_=max(f_,f_+sum_)
fi,j=
max(
fi,j
,fl
,j−1
+su
ml+1
,i)
s um
sumsu
m 就是從 j
jj 到 i
ii 的單詞個數
然後 sum
sumsu
m 就可以在前面預處理暴力算出來
#include
using
namespace std;
int p,n,m,k,f[
210][50
],sum[
210]
[210];
string s,a[10]
;bool
check
(int l,
int r)
intmain()
cin>>n;
m=s.
length()
-1;for
(int i=
1;i<=n;i++
) cin>>a[i]
;for
(int i=m;i>=
1;i--
)for
(int j=i;j>=
1;j--
) f[0]
[0]=
0;for(
int i=
1;i<=k;i++
) f[i]
[i]=f[i-1]
[i-1
]+sum[i]
[i];
for(
int i=
1;i<=m;i++
) f[i][1
]=sum[1]
[i];
for(
int i=
1;i<=m;i++
)for
(int j=
1;j<=k&&j)for
(int k=j;k) f[i]
[j]=
max(f[i]
[j],f[k]
[j-1
]+sum[k+1]
[i])
;printf
("%d"
,f[m]
[k])
;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份,且每份中包含的單詞個數加起來總數最大。每份中包含的單詞可以部分重疊。當選用乙個單詞之後,其第乙個字母不能再用。例如字串 this 中可包含 this ...