HDU1421:搬寝室(线性dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1421
又是一道,没有思想的题,看了题解,我发现我的dp题几乎都看了题解,我总是想不好状态转移方程,汗颜,以后怎么比赛啊。
先排序,然后说一个数学问题。
首先,要怎么搬呢?即每一对要怎么取?如果有abcd四个数,且a<b<c<d,应该是取ab,cd好呢还是ac,bd好?抑或是bc,ad好呢?答案是第一种,因为:
(a-b)^2+(c-d)^2 < (a-c)^2+(b-d)^2
(a-b)^2+(c-d)^2 < (a-d)^2+(b-c)^2
即每对物品都应是重量最为接近的物品,也就是说对n件物品排序后,每对物品都应该是连续的。
定义数组w[i]为搬第i对物品所消耗的疲劳值;数组dp[n][k]来表示在n件物品中搬k对的最佳状态,而达到这一状态的决策可能为:
- 第n件物品不搬,即在前n - 1件物品中搬k对,那么疲劳值仍为dp[n - 1][k];
- 第n件物品要搬,那么根据上面所证,第n - 1件物品也要同时搬,即在前n - 2件物品中搬k - 1对物品,再搬最后一对物品,那么疲劳值为dp[n - 2][k - 1] + w[n - 1]。
为使疲劳值最小,因此最佳策略为取两种决策中的最小值,即应使:
dp[n][k] = min(dp[n - 1][k], dp[n - 2][k - 1] + w[n - 1])
应该注意的是要考虑边界问题,dp[i][j]中:
- 当2 * j > i时,即要搬的数量超过了物品总量,这是不可能发生的,因此此时令dp[i][j]为无穷大;
- 当j == 0时,即在一对物品都没搬时,所需疲劳值应该是0,此时令dp[i][j] = 0。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,k,w[],dp[][]; int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
}
sort(w+,w++n);
for(int i=;i<n;i++)
{
w[i]=w[i+]-w[i];
w[i]=w[i]*w[i];
}
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
dp[i][j]=inf;
}
}
for(int i=;i<=n;i++)
dp[i][]=; //边界的处理
for(int i=;i<=n;i++)
{
for(int j=;j*<=i;j++)
{
dp[i][j]=min(dp[i-][j-]+w[i-],dp[i-][j]);
}
}
printf("%d\n",dp[n][k]);
}
return ;
}
HDU1421:搬寝室(线性dp)的更多相关文章
- HDU-1421 搬寝室【dp】
题目链接:https://vjudge.net/contest/214662#problem/E 题目大意: ...
- HDU 1421 搬寝室 (线性dp 贪心预处理)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- hdu1421 搬寝室(dp)
此题是动态规划题. 解题思路: 用w[i]存储n个物品的重量,对其进行排序. 那么当取了第i个物品,必然会取第i-1个物品. 令dp[i][j]表示前i个物品,取j对的最小疲劳度. 若取第i个物品 则 ...
- hdu---(1421)搬寝室(dp)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1421 搬寝室(dp)
Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆, ...
- 题目1452:搬寝室(dp题目)
题目链接:http://ac.jobdu.com/problem.php?pid=1452 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- hdu 1241 搬寝室 水dp
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...
- hdu1421搬寝室(动态规划)
搬寝室 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu-1421搬寝室(dp)
http://acm.hdu.edu.cn/showproblem.php?pid=1421; 思路:先将所给的椅子的价值按升序排列,举个例子,四张椅子的价值分别为a,b,c,d(a<b< ...
随机推荐
- oracle,mysql分页
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...
- scala读写文件
def main(args: Array[String]): Unit = { //1 read for( i<- Source.fromFile("test.dat").g ...
- 搭建hadoop集群,
这个教程是2.4.1的 ,但是亲测对于2.6.5,是可以用的,对2.5.4应该也是支持的 1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconf ...
- Nginx指令概述
指令概述 配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括.但是如果配置指令包含空格,一定要引起来. 指令参数 指令的参数使用一个或者多个空格或者TAB字符与指令分开.指令的参数有一个或 ...
- 经典sql 语句大全
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- WCF系列 基础概念
WCF全称Windows Communication Foundation,是微软构建面向服务的分布式编程框架.而它其实是统一了COM和.Net Remoting等分布式技术提供一个完整,通用,可靠的 ...
- springboot查找配置文件路径的过程
spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicati ...
- CH Round #54 - Streaming #5 (NOIP模拟赛Day1)(被虐瞎)
http://ch.ezoj.tk/contest/CH%20Round%20%2354%20-%20Streaming%20%235%20%28NOIP%E6%A8%A1%E6%8B%9F%E8%B ...
- Wise 打包细节
细节 说明 添加卸载快捷方式 缺省的安装程序快捷方式中没有卸载项:只能通过控制面板删除,或者主程序目录下的UnWise.exe来卸载.实际上,该文件就可以作为卸载程序. 可以复制一个快捷方式,将程序名 ...
- ajax利用html5新特性带进度条上传文件
http://blog.csdn.net/pkgray/article/details/27591283 http://www.matlus.com/html5-file-upload-with-pr ...