RQNOJ273_马棚问题

题目描述
每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K

个马棚。他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动。因此

他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号。而且

,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并

不十分融洽。如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快

系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小。

输入格式
输入:在第一行有两个数字:n(1≤n≤500)和k(1≤k≤n)。在接下来的n行是n个数。在这些行中的第i行代

表队列中的第i匹马的颜色:1意味着马是黑色的,0意味着马是白色的。

输出格式
输出:只输出一个单一的数字,代表系数总和可能达到的最小值。

样例输入
6 3  {6匹马,3个马棚}
1    {第1匹马为黑马}
1
0    {第3匹马为白马}
1
0
1
样例输出
2    {最小系数总和}

//--------------------------------------------------------------------------------------

分析:f[i,j]表示将前i匹马分到j个马棚中的最小系数总和.

用sw[i]记录从1~i中白马的个数,sb[i]为黑马个数.

f[i,j]=min{f[k,j-1]+(sw[i]-sw[k)*(sb[i]-sb[k])}

code:

const oo=100000000;
var   f:array[0..501,0..501] of longint;
      w,b,sb,sw:array[0..501] of longint;
      n,k,i,j,l,color,minx:longint;


      function min(a,b:longint):longint;
      begin
            if a<b then exit(a); exit(b);
      end;


begin
      readln(n,k);
      for i:=1 to n do
      begin
            readln(color);
            if color=1 then inc(b[i])
            else inc(w[i]);
      end;
      for i:=1 to n do sb[i]:=sb[i-1]+b[i];
      for i:=1 to n do sw[i]:=sw[i-1]+w[i];

      for i:=1 to n-k+1 do f[1,i]:=sb[i]*sw[i];
      for i:=2 to k do
         for j:=i to n-k+i do
         begin
               minx:=oo;
               for l:=i-1 to j-1 do
                  minx:=min(minx,f[i-1,l]+(sb[j]-sb[l])*(sw[j]-sw[l]));
               f[i,j]:=minx;
         end;
      writeln(f[k,n]);
end.

转载于:https://www.cnblogs.com/exponent/archive/2011/08/08/2130686.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值