42 条题解
-
02mc LV 10 @ 2009-08-18 17:34:45
五维数组2x4x4x4x4的,写吧。
细节注意比如送前三份时,有些状态是取不到的。
加上puppy,过。
ps:第222人 -
02009-08-15 20:57:27@
直接开个5维数组,用滚动的就好了啊....
f[0..1,0..3,0..3,0..3] -
02009-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 -
02009-06-27 20:12:02@
f:array[boolean,0..3,0..3,0..3,0..3] of longint;
原来可以这样设 -
02009-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 -
02009-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. -
02009-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.细节问题要注意,状态要注意是否合法. -
02009-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过得超猥琐,用的四维数组。
-
02008-11-25 19:38:00@
Accepted 有效得分:100 有效耗时:1394ms
好慢啊 ~
-
02008-11-07 12:21:02@
好多重循环……看着眼都晕了……
-
02008-11-06 11:49:39@
不会状态压缩。用的true1023的方法。
还有就是注意前两天的情况。 -
02008-11-02 18:15:40@
一定要用滚动数组啊!!
还有不要随便就转移!转移必须合法! -
02008-11-01 17:28:59@
开始那个状态不好弄哦,就是上两顿什么都没吃的时候...
滚动数组+DP
很险的AC的.. -
02008-10-26 20:06:57@
Vijos Dolphin 测 90分
Vag 6k测就AC了 -
02008-10-10 12:26:43@
囧,原来有3s时限。。
-
02008-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的题解 -
02008-09-01 20:30:19@
f
-
02008-07-21 14:52:50@
dp
状态很少,自己用常量定义下就很简单了 -
02008-07-21 14:52:06@
写了一个既不像DP又不像BFS的程序交上去,竟然一次AC!之前还没做过这题,哪个ACM题库貌似有这题,不过没做过
-
02008-07-21 08:51:32@
又只能住地下室了......