2023年noip全國聯賽提高組
題目等級 : ** gold
給出乙個長度不超過200的由小寫英文本母組成的字母串(約定;該字串以每行20個字母的方式輸入,且保證每行一定為20個)。要求將此字母串分成k份(1輸入描述 input description
第一行為乙個正整數(0輸出描述 output description
每行乙個整數,分別對應每組測試資料的相應結果。
樣例輸入 sample input
11 3
thisisabookyouareaoh4is
aoksab樣例輸出 sample output
目標:前i個字元中劃分為j個部分包含的單詞數
如果知道i——j包含的單詞數,動態規劃可推出答案。
若想知道i——j包含的單詞數,處理出以每個位置為起點是否有單詞、單詞長度可推出。
所以:ans[j][i]表示前j個字元劃分為i個部分包含的單詞數
預處理:f[i][j] i——j包含的單詞數 g[i]=j 以i為起點有長為j的單詞
f陣列處理:如果i+g[i]-1<=j,那麼f[i][j]裡包含以i為起點長為j的單詞
狀態轉移:ans[j][i]=max(ans[k][i-1]+f[k+1][j])
#include#include#include
using
namespace
std;
int t,p,k,sum,g[401],f[201][201],ans[201][41
];string s,ss,word[7
];int len_tot,len[7
];void
pre()
intmain()
len_tot=s.length();
scanf("%d
",&sum);
for(int i=1;i<=sum;i++) cin>>word[i];
for(int i=1;i<=sum;i++) len[i]=word[i].length();
memset(g,
127,sizeof
(g));
for(int i=0;i)
for(int j=1;j<=sum;j++)
if(s.substr(i,len[j])==word[j]&&g[i]>len[j]) g[i]=len[j];
for(int i=0;i)
for(int j=i;j)
for(int l=i;l<=j;l++)
for(int i=0;i1]=f[0
][i];
for(int i=2;i<=k;i++)
for(int j=i;j)
for(int l=i-1;l)
ans[j][i]=max(ans[j][i],ans[l][i-1]+f[l+1
][j]);
printf(
"%d\n
",ans[len_tot-1
][k]);
} }
統計單詞個數
輸入 檔名稱 sum123.cpp 作 者 林海雲 完成日期 2014年12月16日 版 本 號 v2.0 問題描述 統計各陣列中單詞的個數 程式輸入 程式輸出 統計結果 include includeusing namespace std int pwordnum char str int mai...
統計單詞個數
qaq 話說這個題目跟那個乘號的比較像啊,用f i j 表示前i個字母劃分為j段的單詞最大數 那麼我們很容易就得到乙個狀態轉移方程 f i j max f i j f l 1 j w w為l i區間裡單詞的數目 現在的問題是w咋求 之前我做的乙個題是劃分乘號的 那個我們處理了乙個sum i j 陣列...
統計單詞個數
從鍵盤輸入一句話,按回車鍵結束,由計數器統計輸入的單字個數。定義乙個計數器類,要求用建構函式把計數器的初值設定為0 用乙個成員函式 countword 用於統計單詞個數,用 display 函式將結果輸出到螢幕上。分析 這個很簡單,具體的思路有很多種,可以直接統計單詞的個數 while不等於空格 或...