- 注册时间
- 2006-1-20
- 最后登录
- 1970-1-1
|

楼主 |
发表于 2009-2-12 11:31:27
|
显示全部楼层
饿
不过好像有其他的解决办法
似乎noi的名额要扩增的样子
……………………………………………………………………………………………………………………………………………………………………
来一个pascal源码- program noip_2001_3__tong_ji_dan_ci_ge_shu;
- var
- wlen:array[1..200]of integer;
- g:array[0..200,0..200]of integer;
- f:array[0..200,0..40]of integer;
- word:array[1..6]of string;
- s,tem:string;
- m,p,n,k,i,j,u,v,nn:integer;
- procedure shuru;
- begin
- s:='';
- readln(p,k);
- n:=p*20;
- for i:=1 to p do
- begin
- readln(tem);
- s:=s+tem;
- end;
- readln(m);
- for i:=1 to m do
- readln(word[i]);
- end;
- procedure mwlen;
- begin
- for i:=1 to n do
- begin
- wlen[i]:=maxint;
- for j:=1 to m do
- if ((word[j]=copy(s,i,length(word[j])))and(length(word[j])<wlen[i]))
- then wlen[i]:=length(word[j]);
- end
- end;
- procedure mg;
- begin
- for i:=1 to n do
- for j:=i to n do
- begin
- g[i,j]:=0;
- for u:=i to j do
- if (i+wlen[u]-1<=j) then inc(g[i,j]);
- end;
- end;
- begin
- assign(input,'d:\test\input3.dat');
- reset(input);
- read(nn);
- while nn>0 do
- begin
- dec(nn);
- shuru;
- mwlen;
- mg;
- fillchar(f,sizeof(f),0);
- for j:=1 to k do
- for u:=j to n do
- for v:=u to n do
- if (f[u-1,j-1]+g[u,v]>f[v,j]) then f[v,j]:=f[u-1,j-1]+g[u,v];
- writeln(f[n,k]);
- end;
- end.
复制代码 |
|