hdu 1421 搬寝室

//效率好低
//状态Dp[i][j]为前i件物品选j对的最优解
//   当i=j*2时,只有一种选择即 Dp[i-2][j-1]+(w[i]-w[i-1])^2
//    当i>j*2时,Dp[i][j] = min(Dp[i-1][j],Dp[i-2][j-1]+(w[i]-w[i-1])^2
#include<iostream>//2313563 2010-04-08 19:12:40 Accepted 1421 890MS 15940K 751 B C++ 悔惜晟
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
long long int dp[2002][1001];
int main()
{
 int n, k, i, j;
 int num[2002];
 while(scanf("%d %d", &n, &k) != EOF)
 {
  for(i = 1; i <= n; i++)
   scanf("%d", &num[i]);
  //for(i = 0; i <= k; i++)
   //dp[0][i] = 0;
   //dp[1][i] = 0;
  sort(&num[1], &num[1] + n);
  memset(dp, 0, sizeof(dp));
  for(j = 1; j <= k; j++)
  {
   
   for(i = 2 * j; i <= n; i++)//一开始这里没处理好,j 写前面是明显好的
   {
    
     if(i == 2 * j)
     dp[i][j] = dp[i - 2][j-1] + (num[i] - num[i - 1]) * (num[i] - num[i - 1]);
    else
     dp[i][j] = min(dp[i - 1][j] ,dp[i - 2][j-1] + (num[i] - num[i - 1]) * (num[i] - num[i - 1]));

   }
  }
   printf("%I64d/n", dp[n][k]);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值