統計單詞個數(劃分型)

2022-03-02 21:50:12 字數 1615 閱讀 5257

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不等於空格 或...