标签:des style blog http color java os io
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17130 Accepted Submission(s):
5805
解题思路:一道DP题
给定n个物品,每个物品有重量,
从中选出m对,使得这m对物品重量差的平方和最小。
疲劳度:m对物品重量差的平方和
分析与解题思路
先对n中物品的重量排序
令dp[i][j]表示前i个物品中选j对的最小疲劳度。
则dp[i][j]可能含有第i个物品(这种情况下,第i种物品一定是和第i-1个物品配对),
则dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])
dp[i][j]的j对也可能不含有第i个物品,此时有
dp[i][j]=dp[i-1][j]
状态转移方程
dp[i][j]=min{dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #define inf 99999999 7 using namespace std; 8 int dp[2005][1005]; 9 int cmp(const void *a,const void *b) 10 { 11 return *(int *)a-*(int *)b; 12 } 13 int main() 14 { 15 int n,k,i,j,a[2005]; 16 while(scanf("%d%d",&n,&k)!=EOF) 17 { 18 19 a[0]=0; 20 for(i=1; i<=n; i++) 21 scanf("%d",&a[i]); 22 for(i=0; i<=n; i++) 23 for(j=1; j<=k; j++) 24 dp[i][j]=inf; 25 dp[0][0]=0; 26 qsort(a+1,n,sizeof(a[0]),cmp); 27 for(i=2; i<=n; i++) 28 for(j=1; j*2<=i; j++) 29 dp[i][j]=min(dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]); 30 printf("%d\n",dp[n][k]); 31 } 32 return 0; 33 }
标签:des style blog http color java os io
原文地址:http://www.cnblogs.com/lxm940130740/p/3902661.html