提交啦n次一直WA,这个bug找啦几个小时,最终才发现数组开小啦,真是遗憾。这是一个典型的DP问题,题目要求从n个中选出k对使得最终疲劳度最小。首先对物品质量a[n]进行一次排序,用dp[i][j]表示从前i个物品中选取j对物品的最小疲劳度,现在我们来探讨状态转移方程,对于第i个物品,我们有选和不选两种选择(当i=2*j时必须选),若选择第i个物品则为啦使得最终疲劳度最小,第i个物品一定与第i-1个物品配对(为什么会是这样?),那么还需要在前i-2个物品中选取j-1对,那么此时dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),若不选第i个物品 ,则问题转化为从前i-1个物品中选取j对物品,那么dp[i][j]=dp[i-1][j];于是得到以下状态转移方程:

dp[i][j]=min{dp[i-1][j,dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1])}(特别的当i=2*j时候,只能dp[i][j]=dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));

先来证明为什么在前面方程中若选第i个物品则它必须与第i-1个物品配对。假设a[i]与a[k](1<=k<=i-2)配对可以使得d[i][j]达到最小,若a[k]之前没有配对过,(1)若a[i-1]之前也没有参与配对,则用(a[i]-a[i-1])*a[i]-a[i-1])代替(a[i]-a[k])*(a[i]-a[k])可以使得d[i][j]达到更小,与假设矛盾.(2)若a[i-1]之前有与某a[m]配对(0<m<i-1),则完全可以用(a[i-1],a[i]),(a[k],a[m])配对来代替(a[i],a[k]),(a[i-1],a[m])来达到最小与假设矛盾.若a[k]之前有与某a[k1]配对过,然后问题转换为再来寻找与a[k1]配对的数a[k2]...直到遇到没有配对的数停止,总能得到a[i]与a[i-1]是最佳匹配。

#include<iostream>
#include<algorithm>
using namespace std;
#define max 2000
int dp[max][1000];
int DP(int a[],int n, int k);
int main(){
int n,k,i;
int a[max];
while (cin >> n >> k){
for (i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
cout << DP(a, n, k) << endl;
}
return 0;
}
int DP(int a[], int n, int k){
int i, j,t;
for (i = 0; i <= n; i++)
dp[i][0] =0; //将第一列初始化为0
for (i = 2; i <= n;i++)
for (j = 1; j <= k&&j <= i / 2; j++){ /*当j>i/2无意义,可以不计算*/
t = dp[i - 2][j - 1] + (a[i] - a[i - 1])*(a[i] - a[i - 1]);
if (j * 2 == i)
dp[i][j] = t; //出现i==2j时特殊处理,因为此时不存在dp[i-1][j]
else
dp[i][j] = t < dp[i - 1][j] ? t : dp[i - 1][j];
}
return dp[n][k];
}

HDU1421的更多相关文章

  1. DP HDU1421

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  2. hdu1421 搬寝室(dp)

    此题是动态规划题. 解题思路: 用w[i]存储n个物品的重量,对其进行排序. 那么当取了第i个物品,必然会取第i-1个物品. 令dp[i][j]表示前i个物品,取j对的最小疲劳度. 若取第i个物品 则 ...

  3. hdu---(1421)搬寝室(dp)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  4. hdu1421 搬寝室 DP

    转载: /*证明:从4个数中 a b c d  依次递增: 选取相邻的两个数一定是最小得 及:(a-b)^2+(c-d)^2<(a-c)^2+(b-d)^2&&(a-b)^2+( ...

  5. HDU1421搬寝室(简单DP)

    当然,还可以加滚动数组优化. #include<cstdio> #include<cstdlib> #include<iostream> #include<m ...

  6. hdu-1421(dp)

    解题思路:dp[i][j]表示前i个物品中取k对所要的最小花费: 首先得对物品进行处理,因为需要当前物品减前一个物品的平方和最小: 所以先排序,因为排序的相邻两个的差的平方一定最小: 然后转移方程:d ...

  7. HDU-1421 搬寝室【dp】

    题目链接:https://vjudge.net/contest/214662#problem/E 题目大意:                                               ...

  8. hdu1421搬寝室(动态规划)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. HDU1421:搬寝室(线性dp)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421 又是一道,没有思想的题,看了题解,我发现我的dp题几乎都看了题解,我总是想不好状态转移方程,汗颜,以 ...

随机推荐

  1. leetcode 【 Linked List Cycle II 】 python 实现

    公司和学校事情比较多,隔了好几天没刷题,今天继续刷起来. 题目: Given a linked list, return the node where the cycle begins. If the ...

  2. IOS开发学习笔记011-xcode使用技巧

    xcode使用技巧 1.自动生成类 2.断点调试 3.代码段保存 4.注释标记 1.新建类,自动生成两个文件和基本结构 第一步  第二步,选择新建一个类,而不是一个源文件  第三步,书写类名一级自己要 ...

  3. python实现删除空文件夹 附源代码

    前言:空文件夹虽然不占空间,但是有时候看着确实挺烦的(别误会,我不是强迫症!),所以写了一个用于删除当前目录下的空文件夹的小程序 环境:win7 64位:python2.7:IDE pycharm20 ...

  4. hnust CZJ-Superman

    问题 B: CZJ-Superman 时间限制: 1 Sec  内存限制: 128 MB提交: 636  解决: 87[提交][状态][讨论版] 题目描述 “那是只鸟?那是飞机?那是——超人!” 程序 ...

  5. vlc无法播放.flv视频文件

    解决方法:https://videoconverter.wondershare.com/vlc/flv-not-displaying-video-vlc-media-player.html. 在pre ...

  6. Sina微博OAuth2框架解密

    自从sina微博oauth2出来以后, 第三方集成开发简单了很多. Oauth2不像oauth1一样需要后台httpclient请求那么麻烦, 一切都可以在前台使用ajax实现了. 很多人觉得蹊跷, ...

  7. [NOI2010][bzoj2005] 能量采集 [欧拉函数+分块前缀和优化]

    题面: 传送门 思路: 稍微转化一下,可以发现,每个植物到原点连线上植物的数量,等于gcd(x,y)-1,其中xy是植物的横纵坐标 那么我们实际上就是要求2*sigma(gcd(x,y))-n*m了 ...

  8. vue子组件向父组件传递数据

    子组件 <template> <div id="header"> <input type="text" v-model=" ...

  9. Linux(Centos) 搭建ReviewBoard

    一.官方安装手册 reviewboard 的安装用户手册:猛击这里 二.常用安装步骤 2.1.安装httpd,+ mod_wsgi, fastcgi, or mod_python yum -y int ...

  10. 【05】js异步编程理解

    1.概念 同步:一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的.同步的.异步:每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务, ...