您的位置:首页 > 其它

【动态规划】【RQNOJ】马棚问题

2010-07-14 11:54 176 查看

题目描述

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

输入格式

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

输出格式

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

样例输入

#include<stdio.h>
#include<iostream>
using namespace std;
int a[501],f[501][501],s[501][501];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i) scanf("%d",&a[i]);
for (int i=1;i<=m;++i)
for (int j=1;j<=n;++j)
f[i][j]=10000;
for (int i=1;i<=n;++i)
{
for (int j=1;j<=n;++j)
{
int x=0;
for (int k=i;k<=j;++k) x+=a[k];
s[i][j]=(j-i+1-x)*x;
}
f[1][i]=s[1][i];
}
for (int l=2;l<=m;++l)
for (int j=l;j<=n;++j)
for (int k=l-1;k<=j;++k)
f[l][j]=min(f[l][j],f[l-1][k]+s[k+1][j]);
printf("%d/n",f[m]
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: