题目链接

题意 :农夫每天都会放马出去,然后晚上把马赶入马厩,于是让马排成一行入马厩,但是不想马走更多的路,所以让前p1匹入第一个马厩,p2匹马入第二个马厩…………但是他不想让他的任何一个马厩空着,所有的马都必须入马厩。有两种颜色的马,如果 i 匹黑马与 j 匹白马同在一个马厩,不愉快系数是 i * j,总系数就是k个系数相加。让总系数最小。

思路 : dp[i][j] 代表的是前 i 个马厩放 j 匹马的最小不愉快系数值。

 //
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std ; int dp[][],black[],white[] ; void Init()
{
for(int i = ; i < ; i++)
{
for(int j = ; j < ; j++)
dp[i][j] = ;
dp[i][i] = ;
}
memset(black,,sizeof(black)) ;
memset(white,,sizeof(white)) ;
}
int main()
{
int N,K,x ;
while(~scanf("%d %d",&N,&K))
{
Init() ;
for(int i = ; i <= N ; i++)
{
scanf("%d",&x) ;
black[i] = black[i-] + x ;
white[i] = white[i-] + (-x) ;
}
for(int i = ; i <= K ; i++)
{
for(int j = i ; j <= N-(K-i) ; j ++)
{
for(int k = i- ; k < j ; k++)
{
dp[i][j] = min(dp[i-][k] + (black[j]-black[k])*(white[j]-white[k]) ,dp[i][j]);
}
}
}
printf("%d\n",dp[K][N]) ;
}
return ;
}
05-01 22:45