統計單詞個數(NOIP 2001提高組)

2022-05-12 23:55:30 字數 1795 閱讀 7217

題目描述 description

給出乙個長度不超過200的由小寫英文本母組成的字母串(約定;該字串以每行20個字母的方式輸入,且保證每行一定為20個)。要求將此字母串分成k份(1

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

要求輸出最大的個數。

輸入描述 input description

第一行為乙個正整數(0

每組的第一行有二個正整數(p,k)

p表示字串的行數;

k表示分為k個部分。

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

再接下來有乙個正整數s,表示字典中單詞個數。(1<=s<=6)

接下來的s行,每行均有乙個單詞。

輸出描述 output description

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

樣例輸入 sample input

11 3

thisisabookyouareaoh4is

aoksab樣例輸出 sample output

7資料範圍及提示 data size & hint

this/isabookyoua/reaoh

至今我遇到的最皮的動態規劃,要用兩次dp,而且還與字串有關(絕望……),但是,還好有學長!

我們先要把每個單詞在整段字串但凡存在,就把 str[ from ][ to ] 標記為1

然後進行第1次dp——推出任意一段存在的最多單詞數

接著,就和先前發的 山區建小學 的dp一模一樣,就是找 k 個分解點,只不過本題是 求出最多的數量

**^-^

#include#include

#include

using

namespace

std;

int str[201][201],f[201][201

];char ls[201

];int

main()

ints;

scanf("%d

",&s);

for(int i=1;i<=s;++i)

if(sf) str[j+1][j+ll]=1

; }

}for(int j=2;j<=l;++j)

for(int i=j-1;i;--i)

if(str[i][j]) str[i][j]+=str[i+1

][j];

else str[i][j]=str[i+1][j]+str[i][j-1]-str[i+1][j-1

];

for(int i=1;i<=l;++i) f[i][1]=str[1

][i];

for(int i=2;i<=l;++i)

for(int j=2;j<=k && j<=i;++j)

for(int q=j-1;qq)

f[i][j]=max(f[i][j],f[q][j-1]+str[q+1

][i]);

printf("%d

",f[l][k]);

memset(str,

0,sizeof

(str));

memset(f,

0,sizeof

(f));

}return0;

}

noip2001統計單詞個數

本題字串處理需要注意 單詞個數的計算 先算s i 表示以i開頭的單詞,若有則s i 1,否則為0.這要充分注意題目的要求 考試時很難想到。另外在算 i,j 中單詞的個數時,如果以i為開頭,需要判斷這個單詞結尾有沒有超過j,沒有才可計入。同樣需要注意有些狀態是達不到的,這時若不賦初值在動規時判斷,狀態...

NOIP2001 統計單詞個數

題三 統計單詞個數 30分 問題描述 給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1樣例 輸入 11 3 thisisabookyouareaoh4is aoksab輸出 說明 不必輸出 7 this ...

noip2001統計單詞個數

最近,迷戀上debug 1.首先暴力一遍num i j 即從i到j串裡包含多少個子串 注意首字母的使用 2.f i j 表示前i個數劃分j次,最多單詞個數 f i j max f i j f k j 1 num k 1 i 注意j,k範圍 include define re return defin...