HDU-1421-搬寝室-dp
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2*k件过去就行了.但还是会很累,因为2*k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.
Input每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).Output对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.Sample Input
2 1
1 3
Sample Output
4
参考文章:
https://blog.csdn.net/cjf1699/article/details/77836795
题意:
给出一个n和k,代表从n件东西里面选出k件物品,再给出n件物品的重量。疲劳度指的是k中任意两件物品重量之差的平方,求最少疲劳度。
思路:
疲劳度是相邻两个物品的重量差的平方,首先是排好序,再重里面找k对最小的相邻差,在取相邻差的时候,定义一个二维的dp数组,用来表示取了多少个相邻差,疲劳度是多少。每两个相邻的相邻差中只能取一个。
我的代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<string.h> 6 #include<iomanip> 7 using namespace std; 8 #define inf 0x3f3f3f3f 9 //#define inf 0x7fffffff 10 11 int a[2020]; 12 int dp[1010][2020]; 13 int main() 14 { 15 std::ios::sync_with_stdio(false); 16 cin.tie(0); 17 cout.tie(0); 18 int n,k; 19 while(cin>>n>>k)//注意一下多组输入不然没有这个就WA 20 { 21 memset(a,0,sizeof(a)); 22 memset(dp,0,sizeof(dp)); 23 for(int i=1; i<=n; i++) 24 cin>>a[i]; 25 sort(a+1,a+n+1); 26 // for(int i=1; i<=n; i++) 27 // dp[0][i]=0; 28 for(int i=1; i<=k; i++) 29 { 30 for(int j=2*i; j<=n; j++) 31 { 32 if(j<2*i) 33 continue; 34 else if(j==2*i) 35 dp[i][j]=inf; 36 else if(j>2*i) 37 dp[i][j]=dp[i][j-1]; 38 dp[i][j]=min(dp[i][j],dp[i-1][j-2]+(a[j]-a[j-1])*(a[j]-a[j-1])); 39 } 40 } 41 cout<<dp[k][n]<<endl; 42 } 43 return 0; 44 }