题目描述
每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚。他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动。因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号。而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并不十分融洽。如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小。
输入格式
输入:在第一行有两个数字:n(1≤n≤500)和k(1≤k≤n)。在接下来的n行是n个数。在这些行中的第i行代表队列中的第i匹马的颜色:1意味着马是黑色的,0意味着马是白色的。
输出格式
输出:只输出一个单一的数字,代表系数总和可能达到的最小值。
样例输入
样例输出
提交题目 Error [ 更改语言 ] Language
拥有 RQNOJ 账号,您可以:
- 查看海量题库,并提交您的代码
- 参加比赛,证明实力
- 与大家讨论,解答疑问,分享心得
注册
已有账号?登录
相关讨论
/* 前J匹马放进i个马棚。 f[i][j]=min(f[i-1][k]+s[k+1][j],f[i][j]) */ #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<string> #include<algorithm> using namespace std; int n,m,f[510][510],s[510][510],a[510]; int main() { scanf("%d%d",&n,&m); memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); 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=x+a[k]; s[i][j]=(j-i+1-x)*x; } f[1][i]=s[1][i]; } for(int i=2;i<=m;i++) for(int j=1;j<=n;j++) for(int k=i-1;k<=j;k++) f[i][j]=min(f[i][j],f[i-1][k]+s[k+1][j]); printf("%d\n",f[m][n]); return 0; }
时间: 2024-10-11 07:24:43