先对a[]按小到大排序.设:dp[i][j]表示前 i 个物品中搬
j 对的最少疲劳度.
显然,当i==2*j时, dp[i][j]=dp[i-2][j-1] + (a[i]-a[i-1])^2
因为,当 (a1-a2)^2+(a3-a4)^2 <=
(a1-a4)^2+(a3-a2)^2 ( a1<=a2<=a3<=a4
).
当i>2*j时, dp[i][j] = min( dp[i-1][j] ,
dp[i-2][j-1]+(a[i]-a[i-1])^2 )
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 int dp[2100][1100]; 5 int a[2100]; 6 int n,k; 7 int pow2(int a) {return a*a;} 8 int min2(int a,int b) {return a<b?a:b;} 9 10 int cmp(const void* a,const void* b){ 11 return *(int*)a-*(int*)b; 12 } 13 14 int main(){ 15 int i,j,l; 16 while(EOF != scanf("%d%d",&n,&k)){ 17 for(i=1;i<=n;i++) 18 scanf("%d",&a[i]); 19 qsort(a+1,n,sizeof(a[0]),cmp); 20 memset(dp,0,sizeof(dp)); 21 for(i=2;i<=n;i++){ 22 l=i/2; 23 for(j=1;j<=l;j++){ 24 if(i==2*j) 25 dp[i][j]=dp[i-2][j-1]+pow2(a[i]-a[i-1]); 26 else 27 dp[i][j]=min2(dp[i-1][j],dp[i-2][j-1]+pow2(a[i]-a[i-1])); 28 } 29 } 30 printf("%d\n",dp[n][k]); 31 } 32 return 0; 33 }
http://acm.hdu.edu.cn/showproblem.php?pid=1058
http://acm.hdu.edu.cn/showproblem.php?pid=2546
【集训笔记】动态规划背包问题【HDOJ1421【HDOJ1058【HDOJ2546,布布扣,bubuko.com
【集训笔记】动态规划背包问题【HDOJ1421【HDOJ1058【HDOJ2546
原文:http://www.cnblogs.com/wushuaiyi/p/3621932.html