抄 NOIP 2001 統計單詞個數

2021-07-23 18:18:16 字數 1910 閱讀 1030

題目描述

給出乙個長度不超過200的由小寫英文本母組成的字母串(約定;該字串以每行20個字母的方式輸入,且保證每行一定為20個)。要求將此字母串分成k份(1< k< =40),且每份中包含的單詞個數加起來總數最大(每份中包含的單詞可以部分重疊。當選用乙個單詞之後,其第乙個字母不能再用。例如字串this中可包含this和is,選用this之後就不能包含th)。

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

要求輸出最大的個數。

輸入輸出格式

輸入格式:

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

p表示字串的行數;

k表示分為k個部分。

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

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

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

輸出格式:

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

輸入輸出樣例

輸入樣例#1:

1 3

thisisabookyouareaoh

4 is

a ok

sab輸出樣例#1: 7說明

this/isabookyoua/reaoh

【分析】

dp方程好想…但是字串匹配太麻煩…借用題解的stl**,順便學習一下

①每讀取一行可以用strcat把字串連在一起

②從字串a中搜尋單詞word可以用char *p=strstr(a,word);

返回null則找不到,順帶可以用p-a==0來判斷單詞是否從a[0]開始匹配。

③先預處理出w[i][j],表示從i到j的單詞數。可以倒著推,w[i][j]=w[i+1][j];(如果存在從a[i]字母開始的單詞,則w[i][j]=w[i+1][j]+1.出現同一字母開頭的多個單詞也還是加1就夠了.)

④f[i][j]表示前i個字母分成j段得到的最大單詞數,答案是f[len][k],可以初始化一下f[i][i]和f[i][1]. 方程f(i,j)=max. 意思就是把1..r的字母先分成j-1段,剩下的r+1..i的字母分成另一段。

【**】

//noip 2001 統計單詞個數 

#include

#include

#include

#include

#include

#define ll long long

#define m(a) memset(a,0,sizeof a)

#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

const int mxn=1e6;

int n,p,k,lenth;

int a[mxn+5],len[10],w[205][205],dp[205][45];

char ch[25],s[205],word[10][205];

inline bool judge(int sta,int end)

return 0;

}int main()

lenth=20*p;

scanf("%d",&n);

fo(i,1,n) scanf("%s",word[i]);

for(j=lenth;j>=1;j--)

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

if(judge(i,j)) w[i][j]=w[i+1][j]+1;

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

fo(i,1,lenth) dp[i][1]=w[1][i];

fo(i,1,lenth)

for(j=2;j<=k && jfo(r,j,i-1)

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

cout}

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