提交啦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];
}

最新文章

  1. JavaScript基础—插曲
  2. fildder学习
  3. ORMLiteDatabase的简单使用并且与其他的表相互联系
  4. android 怎么动态设置button 的style
  5. Informatica9.6.1在Linux Red Hat 5.8上安装遇到的有关问题整理_4
  6. UVa 699 The Falling Leaves
  7. oracle rac 学习(转载)
  8. Android-ViewPagerIndicator
  9. JavaScript经典面试题系列
  10. 俄罗斯方块:Python实现
  11. lokijs
  12. 这丫头也的还真清楚,但是跑不通呢,换3.0.3的mybatis也不行
  13. 我的学习之路_第二十七章_jQuery
  14. maven国内镜像(国内oschina的maven服务器关了)
  15. 一分钟上手artTemplate
  16. C#中struct和class的区别详解
  17. _itemmod_hidden
  18. css3渐变 两边透明中间高亮
  19. Apache Solr 介绍
  20. Sqlite向MySql导入数据

热门文章

  1. 最简单的RSA及其几个网站和工具
  2. Robotium测试报告的生成方法(上)
  3. 查看sqlserver表空间
  4. Ethernet,token ring,FDDI,ATM,WLAN
  5. 用最优方法从LinkedList列表中删除重复元素
  6. BestCoder 2nd Anniversary/HDU 5718 高精度 模拟
  7. wordpress install 主题
  8. 分布式存储ceph集群实践
  9. 关于fixed定位的一些错误看法纠正
  10. Linux下常用的命令记录