NOIP2001 統計單詞個數

2021-07-10 20:52:06 字數 1451 閱讀 7079

題三 統計單詞個數(30分)

問題描述

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

輸入:

11 3

thisisabookyouareaoh4is

aoksab輸出: //說明:(不必輸出)

7 // this/isabookyoua/reaoh

【思路】

dp+字串。

最優劃分。設d[i][j]表示把前i個數劃分為j段的最大單詞數。則有轉移方程:

d[i][j]=max(d[i][j],d[k][j-1]+sum[k+1][i]);

其中sum(s,t)表示st段內的單詞數,離線計算。

【**】

1 #include2 #include3

using

namespace

std;45

const

int maxn = 200+10;6

7string expr="";8

string

words[maxn];

9int

wordslen[maxn],sum[maxn][maxn];

10int

d[maxn][maxn];

11int

p,k,m;

1213

int add(int l,int

r)14;18

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

1936}37

}38}39

return

ans;40}

4142

intmain()

49 cin>>m;

50for(int i=1;i<=m;i++)

5455

int len=expr.size();

56for(int i=0;i)

57for(int j=i;j)

6061

for(int i=0;i1;i++)

62for(int j=1;j<=min(k-1,i+1);j++)

63for(int k=j-2;k)

64if(j==1) d[i][j]=sum[0

][j];

65else d[i][j]=max(d[i][j],d[k][j-1]+sum[k+1

][i]);

66int ans=0;67

for(int i=k-1;i1;i++)

68 ans=max(ans,d[i][k-1]+sum[i+1][len-1

]);69 cout<70return0;

71 }

noip2001統計單詞個數

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

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

NOIP2001 統計單詞個數

p1026 統計單詞個數 給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1單詞在給出的乙個不超過6個單詞的字典中。要求輸出最大的個數。輸入格式 每組的第一行有二個正整數 p,k p表示字串的行數 k表示分...