标签:des style blog io color ar os java for
xhd
题目大意:有N件物品,给你每件物品的重量,现在要搬2*k件物品到另
一栋楼上,每次搬两件物品,每次耗费的疲劳度为两件物品重量差的平
方。问:搬完2*k件物品,耗费的疲劳度最少为多少?
思路:重量相差越小,则重量差的平方越小。所以先对重量进行排序,所
选的一对物品,肯定是相邻的两件物品。设d[i][j]为前第i件物品选择第j对
物品的时候,所消耗的最小疲劳度。
前i件物品,若选择第i件物品,肯定是和第i-1件物品配对。
这时候dp[i][j] = dp[i-2][j-1] + (w[i]-w[i-1])*(w[i]-w[i-1])
即前i-2件物品,前j-1对的状态加上i-1和i两件物品的疲劳度
前i件物品,若不选择第i件物品,则dp[i][j]的j对肯定也不
含有第i件物品。
这时候dp[i][j] = dp[i-1][j]
即前i-1件物品,前j对的状态
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int w[2020],dp[2020][2020];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
memset(w,0,sizeof(w));
for(int i = 1; i <= n; i++)
scanf("%d",&w[i]);
sort(w+1,w+n+1);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= k; j++)
dp[i][j] = 0xffffff0;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; 2*j <= i;j++)
{
dp[i][j] = min(dp[i-1][j],dp[i-2][j-1] + (w[i]-w[i-1])*(w[i]-w[i-1]));
}
}
printf("%d\n",dp[n][k]);
}
return 0;
}
标签:des style blog io color ar os java for
原文地址:http://blog.csdn.net/lianai911/article/details/40867225