118 条题解
-
03830372 LV 8 @ 2009-09-15 21:33:17
var
s:string;
i,j,p,k,n,i2,max,l:longint;
st,dic:array[1..20]of string;
a:array[1..10000]of longint;
f,d:array[0..1000,0..1000]of longint;Procedure init;
begin
readln(p,k);
s:='';
for i:=1 to p do begin
readln(st[i]);
s:=s+st[i];
end;
readln(n);
l:=length(s);
for i:=1 to n do readln(dic[i]);
end;Procedure dp;
begin
fillchar(f,sizeof(f),0);
for i:=1 to l do
begin
a[i]:=1000;
for j:=1 to n do
if (pos(dic[j],copy(s,i,l-i+1))=1) and (length(dic[j]) -
02009-09-15 16:18:03@
{ f=max(f[k,j-1]+g[k+1,i]) (f 为前i个字符,分为j份的最大单词个数 g为从第i到第j的字母中单词最大个数)}
{边界 F[x,1]=g[0,x]}var s,str:ansistring;
w:array[0..1001] of string;
a:array[0..101] of char;
l:array[0..100001] of longint;
f,g:array[0..501,0..501] of longint;
i,m,n,k,p,j,len,s1:longint;
begin
readln(p,k);
for i:=1 to p do
begin
readln(str);
s:=s+str;
end;
readln(s1);
n:=p*20;
for i:=1 to s1 do
readln(w[i]);
for i:=1 to s1-1 do
for j:=1 to s1-i do
if length(w[j])>length(w[j+1]) then
begin
w[0]:=w[j];
w[j]:=w[j+1];
w[j+1]:=w[0];
end;
for i:=1 to n do
begin
l[i]:=n+1;
for j:=1 to s1 do
if copy(s,i,length(w[j]))=w[j] then
begin
l[i]:=length(w[j])+i-1;
break;
end;
end;
for i:=1 to n do
for j:=1 to n do
for p:=i to j do
if l[p]f then
f:=f[p,j-1]+g[p+1,i];
end;
writeln(f[n,k]);
end. -
02009-09-10 20:35:36@
鄙视
216错误
数组改统一就过了
一开始第一个还超时
就改个数组就AC了
程序一字没改 -
02009-09-08 21:10:03@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms以上内容,纯属虚构。
-
02009-09-03 23:39:07@
先预处理字符,
转化为数字关系
然后DP编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-09-03 17:27:13@
我很想问...........楼下如出现重复........
-
02009-08-16 14:48:17@
秒杀!!!!!!
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar
m,n,x,y,i,j,h,k,l,max:integer;
s,t: string;
a:array[0..6]of string;
len:array[0..6]of integer;
f,p:array[0..200,0..200]of integer;
begin
readln(m,n);
for i:=1 to m do begin
readln(t);
s:=s+t;
end;
readln(k);
for i:=1 to k do begin
readln(a[i]);
len[i]:=length(a[i]);
end;
l:=length(s);
for x:=1 to l do
for i:=1 to l-x+1 do begin
j:=i+x-1;
f:=f;
for y:=1 to k do
if (x>=len[y])and(copy(s,i,len[y])=a[y]) then
f:=f+1;
end;
for i:=1 to l do
p:=f[1,i];
for h:=2 to n do
for i:=h to l do
for j:=h-1 to i-1 do
if p -
02009-08-13 22:43:06@
f=max{f+op}(其中i-p>=j-1)
第三点没过的同学注意了,范围要定i-p>=j-1,否则会多算一点。
第四点没过的同学很无辜,是因为单词表中有重复的词。 -
02009-08-13 15:07:00@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案错误... ├ 标准行输出 193
├ 错误行输出 200├ 测试数据 04:答案错误... ├ 标准行输出 125
├ 错误行输出 159├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Unaccepted 有效得分:60 有效耗时:0ms??????????????
爽啊!对于难以领会的34点,我暴力了.....
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-08-11 21:36:48@
一次统计一次DP,的确很有内涵,好在两个部分都不复杂,DP也很基础
-
02009-08-08 11:47:39@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msdp,分割字符串类的dp。注意预处理。当然贪心也可以过,而且也很快。
-
02009-08-04 11:32:07@
第一次第三个点错
原因是没有注意边界,结果转移了不必要的状态……
所以边界是很重要的呀…… -
02009-08-03 10:52:36@
字符串预处理+DP=AC(一次)
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
var
p,k,n:longint;
s:string;
f:array[0..200,0..40] of longint;
work:array['a'..'z',1..6] of string[20];
num:array['a'..'z'] of longint;
y:array[1..200] of longint;procedure init;
var
i:longint;
ss:string;begin
readln(p,k);
s:='';
for i:=1 to p do
begin
readln(ss);
s:=s+ss;
end;
readln(n);
for i:=1 to n do
begin
readln(ss);
inc(num[ss[1]]);
work[ss[1],num[ss[1]]]:=ss;
end;
end;procedure ycl;
var
i,j,l,st,long:longint;begin
fillchar(y,sizeof(y),127);
for i:=1 to p*20 do
begin
for j:=1 to num[s[i]] do
begin
l:=i;
st:=1;
long:=length(work[s[i],j]);;
while true do
begin
if s[l]work[s[i],j,st] then break;
if st=long then
begin
if l -
02009-08-01 12:37:23@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 197ms
├ 测试数据 05:答案正确... 244ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:441ms非kmp
-
02009-07-28 22:57:35@
#define L 200
#define S 6
#define K 40
**├ 测试数据 03:答案错误...
├ 标准行输出 193
├ 错误行输出 196
**记录#define L 2000
#define S 60
#define K 400
Accepted
记录怎么回事?难道题目的数据范围有问题?
-
02009-07-27 22:01:19@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms经过不懈奋斗,终于AC了......
-
02009-10-30 13:09:15@
重新写了一个DP的。开始预处理写椭了。第三点总出196.。。。。
郁闷郁闷 改了我一个半小时。。。。。program ex6;
var dic:array[1..6]of string;
w:array[0..200,0..200]of longint;
f:array[1..200,1..40]of longint;
p,k,s,n:longint;
r:string;procedure fillw(x,y:longint);
var i:longint;
begin
if y=j-1 then
if f+w>f
then f:=f+w;
writeln(f[p*20,k]);
end;begin
init;
work;
end. -
02009-07-25 22:55:32@
我们可以使用简单的区间动态规划.
-
02009-07-20 14:42:49@
这道题真是==
真实很销魂-- -
02009-07-17 16:41:35@
水题
KMP预处理+Dp