首页 > 其他 > 详细

RQN 273 马棚问题 dp

时间:2016-07-29 20:53:33      阅读:223      评论:0      收藏:0      [点我收藏+]
PID273 / 马棚问题 
题目描述

每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚。他把他的马排成一排然后跟随它走向马棚, 因为他们非常疲劳,小明不想让他的马做过多的移动。因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序 号。而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并不十分融洽。如果有i个白马和j个黑马在 一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小。

输入格式

输入:在第一行有两个数字:n(1≤n≤500)和k(1≤k≤n)。在接下来的n行是n个数。在这些行中的第i行代表队列中的第i匹马的颜色:1意味着马是黑色的,0意味着马是白色的。

输出格式

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

样例输入
样例输出

思路:dp[i][t]=min(dp[i][t],dp[j][t-1]+(h[i]-h[j])*(b[i]-b[j]));

      dp[i][t]表示第i匹马放入第t个马棚的最小答案;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll __int64
#define esp 0.00000000001
const int N=1e3+10,M=1e6+10,inf=1e9+10,mod=1000000007;
int a[N];
int h[N];
int b[N];
int dp[N][N];
int main()
{
    int x,y,z,i,t;
    while(~scanf("%d%d",&x,&y))
    {
        for(i=0; i<=x; i++)
            for(t=0; t<=y; t++)
            dp[i][t]=inf;
        dp[0][0]=0;
        for(i=1;i<=x;i++)
        {
            scanf("%d",&a[i]);
            h[i]=h[i-1];
            b[i]=b[i-1];
            if(a[i])
                h[i]++;
            else
                b[i]++;
        }
        for(t=1;t<=y;t++)
        {
            for(i=t;i<=x;i++)
                for(int j=t-1;j<i;j++)
                dp[i][t]=min(dp[i][t],dp[j][t-1]+(h[i]-h[j])*(b[i]-b[j]));
        }
        printf("%d\n",dp[x][y]);
    }
    return 0;
}

 

RQN 273 马棚问题 dp

原文:http://www.cnblogs.com/jhz033/p/5719383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!