传送门
设f[i][x1][x2][y1][y2]表示前i车食品,前两车送往A的是x1x2,送往B的是y1y2的最优答案。
转移枚举当前食品车放A还是B。
罕见Pascal代码。
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 i1<>0 then begin
s:=s+[i1];
inc(w[i1,i2,t]);
end;
if (i2<>0) and (i1<>i2) 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.