HDU1424 动态规划

搬寝室

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4850    Accepted Submission(s): 1524

Problem Description

搬 寝室是很累的,xhd 深有体会. 时间追述200679, 那天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

 

 

先把所有物品按照重量从小到大排序 , dp[i][j] 为前 i 个物品中伴奏 j 对要花费的最小疲劳度 , 转移方程为 :dp[i][j]= min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));

 

 

 

#include<stdio.h> #include<string.h> #include<algorithm> using std::sort; #define inf 2100000000 #define N 2005 int dp[N][1005],a[N]; int min(int a,int b) { return a<b?a:b; } int main() { int i,j,m,n,res,k; while (scanf("%d%d",&n,&k)!=EOF) { for(i=1; i<=n; ++i) scanf("%d",&a[i]); sort(a+1,a+n+1); memset(dp,0,sizeof(dp)); for (i=1; i<=k; ++i) dp[1][i]=dp[0][i]=inf; dp[0][0]=0; for (i=2; i<=n; ++i) { m=min(i/2,k); for (j=1; j<=m; ++j) { if (i-1>=j*2) dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])); else dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]); } } res=inf; for (i=2*k; i<=n; ++i) { if (res>dp[i][k]) res=dp[i][k]; } printf("%d/n",res); } return 0; }

你可能感兴趣的:(input,n2,output)