bzoj1806: [Ioi2007]Miners 矿工配餐

传送门
设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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值