[HDU 1421]搬寝室(富有新意的DP)
题目地址: pid=1421" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1421
题目大意:给出n个物品,要你选出k对物品。使得每对物品之差的平方之和最小。
思路。动态规划求解。首先将物品按重量升序排序,依据贪心思想,每对物品必定是相邻的两个物品,这样重量差的平方才干保证最小。然后DP,用f[i][j]表示前i个物品,选j对的最少代价,这里须要进行一个重要的分类讨论:
(1)假设j*2=i,即前i个物品所实用于配对了,非常明显第j对物品是第i-1号物品和第i号物品,f[i][j]=f[i-2][j-1]+(w[i]-w[i-1])^2
(2)其它情况。前i个物品并没有全然用于配对。能够选择第i个物品不配对。这时f[i][j]=f[i-1][j]。或者第i个物品參与配对,同(1)。第i个物品和第i-1个物品配对,f[i][j]=f[i-2][j-1]+(w[i]-w[i-1])^2
终于的答案就是f[n][k]
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm> #define MAXN 2010 using namespace std; int f[MAXN][MAXN]; //f[i][j]=前i个物品。选j对的最小花费
int w[MAXN]; int min(int a,int b)
{
if(a<b) return a;
return b;
} int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(f,0,sizeof(f));
w[0]=0;
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
sort(w+1,w+n+1);
for(int i=2;i<=n;i++) //前i个物品
for(int j=1;j*2<=i;j++) //选j对
{
if(i!=2*j) f[i][j]=min(f[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]),f[i-1][j]); //要么第i个物品和第i-1个物品配对。要么留着第i个物品不配对
else f[i][j]=f[i-2][j-1]+(w[i]-w[i-1])*(w[i]-w[i-1]);
}
printf("%d\n",f[n][k]);
}
return 0;
}
[HDU 1421]搬寝室(富有新意的DP)的更多相关文章
- 题解报告:hdu 1421 搬寝室(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9 ...
- hdu 1421:搬寝室(动态规划 DP + 排序)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1421 搬寝室 (线性dp 贪心预处理)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu 1421 搬寝室(dp)
Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...
- HDU 1421 搬寝室(经典DP,值得经常回顾)
搬寝室 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status D ...
- HDU 1421 搬寝室
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- HDU 1421 搬寝室 解题报告(超详细)
**搬寝室 Time Limit: 2000/1000 MS Memory Limit: 65536/32768 K Problem Description 搬寝室是很累的,xhd深有体会.时间追述2 ...
- 【dp】HDU 1421 搬寝室
http://acm.hdu.edu.cn/showproblem.php?pid=1421 [题意] 给定n个数,要从n个数中选择k个二元组{x,y},最小化sum{(x-y)^2} 2<=2 ...
- hdu 1421 搬寝室 (dp)
思路分析: dp[i][j] 表示选取到第 i 个 组成了 j 对的最优答案. 当然排序之后 选取相邻两个是更优的. if(i==j*2) dp[i][j] = dp[i-2][j-1] + w[ ...
随机推荐
- C# 获取当月有多少天
int days = DateTime.DaysInMonth ( 2009, 9 ); int days = DateTime.DaysInMonth ( DateTime.Now.Year, Da ...
- React新的安装less的方法
yarn add less less-loader -D yarn eject 在webpack.config.js文件中 const sassRegex = /\.(scss|sass)$/; co ...
- Spring Boot (5) Spring Boot配置详解
application.properties application.properties是spring boot默认的配置文件,spring boot默认会在以下两个路径搜索并加载这个文件 src\ ...
- Java中final、finally、finalize的区别与用法
1.简单区别:final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承.finally是异常处理语句结构的一部分,表示总是执行.finalize是Object类的一个方法,在垃 ...
- (转)Bootstrap 之 Metronic 模板的学习之路 - (3)源码分析之 body 部分
https://segmentfault.com/a/1190000006697252 body 的组成结构 body 部分包含了 HEADER.CONTAINER.FOOTER,其中 CONTAIN ...
- sqlserver where in 在 mysql
) tmp); 主句(select * from (从句 temp) sql的 where in 删除 要更改为 // in( select * from ((select idfrom twhe ...
- Object.assign和序列/反序列
Object.assign let testObj = { a:[1,2,4], b:{ name:'ls', school:['huf','yelu'], parent:{ father:'lili ...
- 使用.Net Core RT 标准动态库
这个文档可以引导你如何通过CoreRT生成一个原生标准的系统动态库让其他编程语言调用. CoreRT 可以构建静态库, 这些库可以在编译时链接或者也可以构建运行时所需的共享库, 创建一个支持CoreR ...
- 在Android 上运行 openCV ,并做灰度变化的一个例子
OpenCVImageProcessing1. 导入Opencv的 androrid SDK灰度算法 OpenCVImageProcessing 导入opencv Jar包,配置OpenCVLibra ...
- Swoole server函数列表(转载)
swoole_server::__construct swoole_server::set swoole_server::on swoole_server::addlistener swoole_se ...