题解

42 条题解

  • 0
    @ 2009-08-18 17:34:45

    五维数组2x4x4x4x4的,写吧。

    细节注意比如送前三份时,有些状态是取不到的。

    加上puppy,过。

    ps:第222人

  • 0
    @ 2009-08-15 20:57:27

    直接开个5维数组,用滚动的就好了啊....

    f[0..1,0..3,0..3,0..3]

  • 0
    @ 2009-07-28 23:51:53

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

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

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

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

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

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

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

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

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

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

    ├ 测试数据 11:答案正确... 56ms

    ├ 测试数据 12:答案正确... 150ms

  • 0
    @ 2009-06-27 20:12:02

    f:array[boolean,0..3,0..3,0..3,0..3] of longint;

    原来可以这样设

  • 0
    @ 2009-05-25 08:48:33

    第一次没写滚动数组,就说最后一个点空间溢出,我自己计算得出空间应该只用了20MB左右,这也会溢出啊……

    请管理员贴一下Vijos的空间限制……

    改成滚动数组后华丽地AC了:

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

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

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

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

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

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

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

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

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

    ├ 测试数据 10:答案正确... 56ms

    ├ 测试数据 11:答案正确... 337ms

    ├ 测试数据 12:答案正确... 586ms

  • 0
    @ 2009-05-12 16:28:54

    编译通过...

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

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

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

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

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

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

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

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

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

    ├ 测试数据 10:答案正确... 9ms

    ├ 测试数据 11:答案正确... 166ms

    ├ 测试数据 12:答案正确... 306ms

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

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

    减枝减枝再减枝!!!!!

    var i1,i2,j1,j2,n,k,t,k1,k2,max,l:longint;

    p,q:boolean;

    c:char;

    s:set of 0..4;

    d,e:array[0..3] of integer;

    w:array[0..3,0..3,1..3] of integer;

    f:array[boolean,0..3,0..3,0..3,0..3] of longint;

    begin

    d[0]:=0;

    d[1]:=1;

    d[2]:=1;

    d[3]:=1;

    e[0]:=1;

    e[1]:=0;

    e[2]:=0;

    e[3]:=0;

    for i1:=0 to 3 do

    for i2:=0 to 3 do

    for t:=1 to 3 do begin

    s:=[];

    w[i1,i2,t]:=0;

    if i10 then begin

    s:=s+[i1];

    inc(w[i1,i2,t]);

    end;

    if (i20) and (i1i2) then begin

    s:=s+[i2];

    inc(w[i1,i2,t]);

    end;

    if not (t in s) then inc(w[i1,i2,t]);

    end;

    p:=true;

    q:=false;

    for i1:=0 to 3 do

    for i2:=0 to 3 do

    for j1:=0 to 3 do

    for j2:=0 to 3 do

    f[p,i1,i2,j1,j2]:=-maxlongint;

    f[p,0,0,0,0]:=0;

    readln(n);

    for k:=1 to n do begin

    for i1:=0 to 3 do

    for i2:=d[i1] to 3 do begin

    if k>4 then l:=e[i1] else l:=0;

    for j1:=l to 3 do

    for j2:=d[j1] to 3 do

    f[q,i1,i2,j1,j2]:=-maxlongint;

    end;

    read(c);

    case c of

    'M':t:=1;

    'B':t:=2;

    'F':t:=3;

    end;

    for i1:=0 to 3 do

    for i2:=d[i1] to 3 do begin

    if k>4 then l:=e[i1] else l:=0;

    for j1:=l to 3 do

    for j2:=d[j1] to 3 do

    if f[p,i1,i2,j1,j2]>-maxlongint then begin

    if f[p,i1,i2,j1,j2]+w[i1,i2,t]>f[q,i2,t,j1,j2] then

    f[q,i2,t,j1,j2]:=f[p,i1,i2,j1,j2]+w[i1,i2,t];

    if f[p,i1,i2,j1,j2]+w[j1,j2,t]>f[q,i1,i2,j2,t] then

    f[q,i1,i2,j2,t]:=f[p,i1,i2,j1,j2]+w[j1,j2,t];

    end;

    end;

    p:=q;

    q:=not q;

    end;

    max:=0;

    for i1:=0 to 3 do

    for i2:=0 to 3 do

    for j1:=0 to 3 do

    for j2:=0 to 3 do

    if f[p,i1,i2,j1,j2]>max then

    max:=f[p,i1,i2,j1,j2];

    writeln(max);

    end.

  • 0
    @ 2009-04-13 21:21:01

    编译通过...

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

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

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

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

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

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

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

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

    ├ 测试数据 09:答案正确... 25ms

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

    ├ 测试数据 11:答案正确... 759ms

    ├ 测试数据 12:答案正确... 1166ms

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

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

    太慢了!

    主体算法是动态规划:

    f表示选取第i辆车后第一个矿的最后运到的两个车分别是x1,x2,第二个矿的最后运到的两个车分别是x3,x4的最大产矿数.

    f=max(f,f)

    {f或f可以到达,即合法,若两个状态都不合法,则f也不合法}

    注:

    1.a[i]可以用数值来表示,例如M为1,F为2,B为3;

    2.因为f[i]的值只与f有关,所以可以利用滚动数组进行优化;

    3.细节问题要注意,状态要注意是否合法.

  • 0
    @ 2009-04-09 07:51:38

    编译通过...

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

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

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

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

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

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

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

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

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

    ├ 测试数据 10:答案正确... 118ms

    ├ 测试数据 11:答案正确... 462ms

    ├ 测试数据 12:答案正确... 742ms

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

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

    过得超猥琐,用的四维数组。

  • 0
    @ 2008-11-25 19:38:00

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

    好慢啊 ~

  • 0
    @ 2008-11-07 12:21:02

    好多重循环……看着眼都晕了……

  • 0
    @ 2008-11-06 11:49:39

    不会状态压缩。用的true1023的方法。

    还有就是注意前两天的情况。

  • 0
    @ 2008-11-02 18:15:40

    一定要用滚动数组啊!!

    还有不要随便就转移!转移必须合法!

  • 0
    @ 2008-11-01 17:28:59

    开始那个状态不好弄哦,就是上两顿什么都没吃的时候...

    滚动数组+DP

    很险的AC的..

  • 0
    @ 2008-10-26 20:06:57

    Vijos Dolphin 测 90分

    Vag 6k测就AC了

  • 0
    @ 2008-10-10 12:26:43

    囧,原来有3s时限。。

  • 0
    @ 2008-10-08 21:15:15

    编译通过...

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

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

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

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

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

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

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

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

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

    ├ 测试数据 10:答案正确... 56ms

    ├ 测试数据 11:答案正确... 291ms

    ├ 测试数据 12:答案正确... 556ms

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

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

    第99个

    不用状态压缩也可以这么快...

    f表示选了第i个后,矿井1最后两个元素为a,b,矿井2为a1,b1;

    f:=max{f+d[x,a,s[i]]}

    f:=max{f+d[x,a1,s[i]} (x为三种配餐的任意一种)

    这里d数组是判断a,b,c三个元素组合后的产矿数量.

    我是用的递推....严格说也不算,就是知道f的时候就推出f[i],一步一步就出来了...没想到还不慢,哈哈!

    这题还可以用状态压缩的DP,详见ioi2007的题解

  • 0
    @ 2008-09-01 20:30:19

    f

  • 0
    @ 2008-07-21 14:52:50

    dp

    状态很少,自己用常量定义下就很简单了

  • 0
    @ 2008-07-21 14:52:06

    写了一个既不像DP又不像BFS的程序交上去,竟然一次AC!之前还没做过这题,哪个ACM题库貌似有这题,不过没做过

  • 0
    @ 2008-07-21 08:51:32

    又只能住地下室了......

信息

ID
1386
难度
5
分类
动态规划 点击显示
标签
递交数
659
已通过
248
通过率
38%
被复制
2
上传者