您的位置:首页 > 其它

hdu1421_搬寝室

2015-11-01 11:43 302 查看
题目:搬寝室

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421

#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 2100
typedef long long LL;
LL dp
[N/2];        //dp[i][j]: 前 i 件中拿走j对最少疲劳度
LL a
;              //记录重量
LL fun(LL i,LL j)     //一次性搬运第 i 件和第 j 件消耗的疲劳度
{
return (a[j]-a[i])*(a[j]-a[i]);
}
LL min(LL a,LL b)
{
return a>b?b:a;
}
int main()
{
LL n,k;
while(scanf("%I64d%I64d",&n,&k)!=EOF)
{
for(LL i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
sort(a,a+n+1);  //关键的一步,排序,排完序以后每次拿走的某对就肯定是相邻的
for(LL i=0;i<=n;i++)
for(LL j=0;j<=n/2;j++)
dp[i][j]=10000000000000;
for(LL i=0;i<=n;i++)  //不管前几件,拿走0对疲劳度肯定为0
dp[i][0]=0;
dp[2][1]=fun(2,1);    //前两件取一对疲劳度固定
for(LL i=3;i<=n;i++)
{
for(LL j=1;j<=i/2;j++)
{
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+fun(i-1,i));
//前i件取j件分两种情况:
//1.第i件不取:那么最佳情况为dp[i-1][j];
//2.第i件取走:那么第j件必然和第j-1件一起拿,那么最佳为dp[i-2][j-1]+fun(i-1,i)
}
}
printf("%I64d\n",dp
[k]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: