UVALive 5097 Cross the Wall
贪心思想,$dp$,斜率优化。
首先将人按照$w$从大到小排序,如果$w$一样,按$h$从大到小排。这样一来,某位置之后,比该位置$h$小的都是不需要考虑的。
因此,形成了如下图所示的结果:

即第一个人最宽,但是最矮,最后一个人最瘦但是最高。
接下来考虑这些人怎么挖洞。还是上图,如果第一个人和第三个人都是从同一个洞里通过的,那么中间那个肯定也可以从那个洞里通过的。
也就是说一定是连续的一段人从同一个洞通过,接下来的任务就是如何将这些人分段。
设$dp[i][j]$表示前$i$个人分成了$j$段的最小费用。那么,$dp[i][j]=min(dp[x][j-1]+w[x+1]*h[i])$。
直接算的话,时间复杂度是$O(n*n*k)$的,超时。可以斜率优化。
写出斜率式子后可以发现是维护一个类似下图的曲线:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<ctime>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar();
x = ;
while(!isdigit(c)) c = getchar();
while(isdigit(c))
{
x = x * + c - '';
c = getchar();
}
} int n,k;
long long dp[][];
struct X
{
long long w,h;
}s[],tmp[];
int q[],f1,f2; bool cmp(X a,X b)
{
if(a.w!=b.w) return a.w>b.w;
return a.h>b.h;
} bool delete1(int t,int a,int b,int c)
{
if(dp[b][t]+s[b+].w*s[c].h<=dp[a][t]+s[a+].w*s[c].h) return ;
return ;
} bool delete2(int t,int a,int b,int c)
{
if( (dp[c][t]-dp[b][t])*(s[b+].w-s[a+].w)>=
(dp[b][t]-dp[a][t])*(s[c+].w-s[b+].w) ) return ;
return ;
} int main()
{
while(~scanf("%d%d",&n,&k))
{
k=min(n,k);
for(int i=;i<=n;i++) scanf("%lld%lld",&tmp[i].w,&tmp[i].h);
sort(tmp+,tmp++n,cmp); int sz=;
s[sz].h=tmp[].h; s[sz].w=tmp[].w;
for(int i=;i<=n;i++)
{
if(tmp[i].h<=s[sz].h) continue;
sz++; s[sz].h=tmp[i].h; s[sz].w=tmp[i].w;
} for(int i=;i<=sz;i++) dp[i][]=s[].w*s[i].h; for(int j=;j<=k;j++)
{
f1=f2=; q[] = j-;
for(int i=j;i<=sz;i++)
{
while()
{
if(f2-f1+<) break;
if(delete1(j-,q[f1],q[f1+],i)) f1++;
else break;
} dp[i][j]=dp[q[f1]][j-]+s[q[f1]+].w*s[i].h; while()
{
if(f2-f1+<) break;
if(delete2(j-,q[f2-],q[f2],i)) f2--;
else break;
} f2++; q[f2]=i;
}
} long long ans=dp[sz][];
for(int j=;j<=k;j++) ans=min(ans,dp[sz][j]);
printf("%lld\n",ans); }
return ;
}
UVALive 5097 Cross the Wall的更多相关文章
- hdu 3669 Cross the Wall(斜率优化DP)
题目连接:hdu 3669 Cross the Wall 题意: 现在有一面无限大的墙,现在有n个人,每个人都能看成一个矩形,宽是w,高是h,现在这n个人要通过这面墙,现在只能让你挖k个洞,每个洞不能 ...
- hdu3669 Cross the Wall
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327680/327680 K (Java/Others) Total Submissi ...
- HDU 3669 Cross the Wall
题目大意 给定 \(N\) 个矩形的宽和高, \((h_1, w_1), (h_2, w_2), \dots, (h_n w_n)\) . 现需要确定 \(k\) (\(k \le K\), \(K\ ...
- uvalive 3276 The Great Wall Game
题意: 一个n * n的棋盘上放着n个棋子,现在要求把这n个棋子用最少的步数移到同一条直线上,即同一列同一行或者同一对角线(两条).输出最少的步数(只能往四个方向移动,即正东,正西,正南,正北). 思 ...
- HDU 3669 Cross the Wall(斜率DP+预处理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3669 题目大意:有n(n<=50000)个矩形,每个矩形都有高和宽,你可以在墙上最多挖k个洞使得 ...
- 动态规划DP的斜率优化 个人浅解 附HDU 3669 Cross the Wall
首先要感谢叉姐的指导Orz 这一类问题的DP方程都有如下形式 dp[i] = w(i) + max/min(a(i)*b(j) + c(j)) ( 0 <= j < i ) 其中,b, c ...
- HDU 3669 [Cross the Wall] DP斜率优化
问题分析 首先,如果一个人的\(w\)和\(h\)均小于另一个人,那么这个人显然可以被省略.如果我们将剩下的人按\(w[i]\)递增排序,那么\(h[i]\)就是递减. 之后我们考虑DP. 我们设\( ...
- [kuangbin带你飞]专题二十 斜率DP
ID Origin Title 20 / 60 Problem A HDU 3507 Print Article 13 / 19 Problem B HDU 2829 Lawr ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
随机推荐
- 机器学习基础知识笔记(一)-- 极大似然估计、高斯混合模型与EM算法
似然函数 常说的概率是指给定参数后,预测即将发生的事件的可能性.拿硬币这个例子来说,我们已知一枚均匀硬币的正反面概率分别是0.5,要预测抛两次硬币,硬币都朝上的概率: H代表Head,表示头朝上 p( ...
- Java —— Reflect反射机制
JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...
- 写一个JavaScript“返回顶部”功能
在web页面中,如果页面较高,为了方便用户快速地返回顶部,都会添加一个返回顶部按钮. 效果演示可以查看本页.如果页面有滚动高度,右下角就会有一个含有“返回顶部”字样的黑色背景半透明的小条条.点击这里“ ...
- ViBe(Visual Background extractor)背景建模或前景检测
ViBe算法:ViBe - a powerful technique for background detection and subtraction in video sequences 算法官网: ...
- LVM to increase and reduce 10G size for /data
=======================increase10G for/data=============================(system env /dev/MongoData00 ...
- VC遍历窗体控件的实现
最近在写控制台,在设计界面按钮风格时不想通过每个按钮的ID来获取其句柄,而是通过遍历窗体所有控件,然后判断其控件类型进而来实现. 代码如下: // 遍历得到页面中的所有Button控件,依次设定其样式 ...
- 【转载】深入理解PHP Opcode缓存原理
转载地址:深入理解PHP Opcode缓存原理 什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode).O ...
- 创建Maven项目出现:An internal error occurred during: "Retrieving archetypes:". Java heap space 错误解决办法
首先说明一下网上的方法: 在Eclipse中创建Maven的Web项目时出现错误:An internal error occurred during: "Retrieving archety ...
- 动态规划:DAG-嵌套矩形
据说DAG是动态规划的基础,想一想还真的是这样的,动态规划的所有状态和转移都可以归约成DAG DAG有两个典型模型,一个是嵌套矩形问题一个是硬币问题,这里仅介绍一个嵌套矩形问题 等二轮复习的时候再补上 ...
- PHP文件操作函数二
PHP部分文件访问函数总结: 1.filetype("文件路径") //可以输出相关文件类型,返回之为:dir/file... 2.stat("文件名") / ...