NOIP2001 統計單詞個數

2022-08-17 13:33:18 字數 1491 閱讀 4070

p1026 統計單詞個數

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

要求輸出最大的個數。

輸入格式:

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

p表示字串的行數;

k表示分為k個部分。

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

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

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

輸出格式:

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

輸入樣例#1:

1 3

thisisabookyouareaoh4is

aoksab

輸出樣例#1:

7

this/isabookyoua/reaoh

用兩次dp, 一次預處理出i到j的單詞數, 第二次dp[i][j]代表到第i個, 分割成j份的最大單詞數, 跑一下區間dp。

在預處理i到j單詞數的時候, 列舉當前字元i, 看以i開頭, 在s中有沒有單詞與它匹配, 尋找的時候, 可以find出pos的值, 但傳參的時候要帶著結束時的j, 判斷一下單詞在不在區間中。

方程if(judge(i, j))

w[i][j] = w[i + 1][j] + 1;

else

w[i][j] = w[i + 1][j];

第二步方程:

dp[i][j] = max(dp[i][j], dp[l][j - 1] + w[l + 1][i]);

#include #include 

#include

#define f(i, l, r) for(int i = l; i <= r; ++i)

#define d(i, l, r) for(int i = l; i >= r; --i)

using

namespace

std;

int w[201][201], dp[201][41

];int

p, k, len, q;

string

s;string wr[7

];void

dp()

bool judge(int x, int

end)

return0;

}void

input()

cin >>q;

len =s.length();

s = "

" +s;

f(i,

1, q)

cin >>wr[i];

}void

word()

intmain()

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...