118 条题解

  • 0
    @ 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])

  • 0
    @ 2009-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.

  • 0
    @ 2009-09-10 20:35:36

    鄙视

    216错误

    数组改统一就过了

    一开始第一个还超时

    就改个数组就AC了

    程序一字没改

  • 0
    @ 2009-09-08 21:10:03

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    以上内容,纯属虚构。

  • 0
    @ 2009-09-03 23:39:07

    先预处理字符,

    转化为数字关系

    然后DP

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-09-03 17:27:13

    我很想问...........楼下如出现重复........

  • 0
    @ 2009-08-16 14:48:17

    秒杀!!!!!!

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var

    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

  • 0
    @ 2009-08-13 22:43:06

    f=max{f+op}(其中i-p>=j-1)

    第三点没过的同学注意了,范围要定i-p>=j-1,否则会多算一点。

    第四点没过的同学很无辜,是因为单词表中有重复的词。

  • 0
    @ 2009-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

  • 0
    @ 2009-08-11 21:36:48

    一次统计一次DP,的确很有内涵,好在两个部分都不复杂,DP也很基础

  • 0
    @ 2009-08-08 11:47:39

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    dp,分割字符串类的dp。注意预处理。当然贪心也可以过,而且也很快。

  • 0
    @ 2009-08-04 11:32:07

    第一次第三个点错

    原因是没有注意边界,结果转移了不必要的状态……

    所以边界是很重要的呀……

  • 0
    @ 2009-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

  • 0
    @ 2009-08-01 12:37:23

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 197ms

    ├ 测试数据 05:答案正确... 244ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:441ms

    非kmp

  • 0
    @ 2009-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

    记录

    怎么回事?难道题目的数据范围有问题?

  • 0
    @ 2009-07-27 22:01:19

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    经过不懈奋斗,终于AC了......

  • 0
    @ 2009-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.

  • 0
    @ 2009-07-25 22:55:32

    我们可以使用简单的区间动态规划.

  • 0
    @ 2009-07-20 14:42:49

    这道题真是==

    真实很销魂--

  • 0
    @ 2009-07-17 16:41:35

    水题

    KMP预处理+Dp

信息

ID
1118
难度
6
分类
动态规划 点击显示
标签
递交数
3793
已通过
1054
通过率
28%
被复制
11
上传者