标签: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