P4890 Never·island(dp)
求门开的最小时间,其实也就是求门关的最大时间。
坐标这么大....显然坐标要离散化
离散化排序后,我们发现x轴被这些点划分成若干条线段$(l,r)$,并且有4种情况
我们用$v[i]$数组表示给队$i$钥匙的贡献
1.左端点为$i$队的起点,右端点为$i$队的终点:显然队$i$钥匙的贡献包括这一段,$v[i]+=r-l$
2.左端点为$i$队的终点,右端点为$j$队的起点:无论如何分配钥匙,这一段都可以关门,于是答案可直接算上$r-l$
3.左端点为$i$队的终点,右端点为$j$队的终点:如果我们给$j$队钥匙,$i$队就可以关门,$v[j]+=r-l$
4.左端点为$i$队的起点,右端点为$j$队的终点:我们只有给$i,j$各一把钥匙,才能算上这一段的贡献
于是我们就在$i,j$之间先连边,边权为$r-l$
蓝后我们又发现,这些点由一些互不相干的链组成。
于是我们按$x轴$从左到右dfs一遍求出dp的优先顺序
最后我们用$f[i][j][0/1]$表示前$i$个点,已给$j$个点钥匙,是否选择了第$i$个(当前)点的最优解
这就是一个二维dp辣
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define rint register int
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
inline int Min(int a,int b){return a<b?a:b;}
void read(int &x){
char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 4005
int n,m,pos[N],tp,h[N],nxt[N],v[N],sv[N];
int f[N][N][],tot; bool vis[N];
map <int,int> mp;
void dfs(int x){vis[h[++tp]=x]=; if(nxt[x])dfs(nxt[x]);}
int main(){
read(n);read(m); int l,r,L,R,tn=n<<;
for(rint i=;i<=n;++i){
read(l), read(r);
pos[i]=l, pos[i+n]=r;
mp[l]=i<<, mp[r]=i<<|;
}sort(pos+,pos+tn+);//离散化
for(rint i=;i<tn;++i){
l=pos[i], r=pos[i+];
L=mp[l], R=mp[r];
if((L&)&&(R&)) v[R>>]+=r-l;
if((L&)&&!(R&)) tot+=r-l;
if(!(L&)&&!(R&)) v[L>>]+=r-l;
if(!(L&)&&(R&)){
if((L>>)==(R>>)) v[L>>]+=r-l;
else nxt[R>>]=L>>,sv[R>>]=r-l;
}
}
for(rint i=;i<=tn;++i){
int p=mp[pos[i]];
if(!(p&)&&!vis[p>>]) dfs(p>>);
}//dfs确定dp顺序
memset(f,0xbf,sizeof(f));//-inf
f[n+][][]=;
for(rint i=n;i;--i){
f[i][][]=;
for(rint j=Min(n-i+,m);j;--j){
f[i][j][]=Max(f[i+][j][],f[i+][j][]);
f[i][j][]=Max(f[i+][j-][],f[i+][j-][]+sv[h[i]])+v[h[i]];
}
}printf("%d",pos[tn]-pos[]-tot-Max(f[][m][],f[][m][]));
return ;
}
P4890 Never·island(dp)的更多相关文章
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
- 最长公共子序列长度(dp)
/// 求两个字符串的最大公共子序列长度,最长公共子序列则并不要求连续,但要求前后顺序(dp) #include <bits/stdc++.h> using namespace std; ...
随机推荐
- powerdesign连接Oracle&Mysql
Oracle部分 想用powerDesign,需要用到oracle数据库,记录配置过程 1,安装win64_11gR2_client,选择安装方式为管理员,按默认选安装,过程大概几分钟就好 2,配置客 ...
- socket发送http报文的疑惑(求高手指点一二)
给8080或80端口的服务端(自己写的serverSocket服务端)发送字符串,此字符串按照http协议拼接而成,既是所谓的http报文.服务端接受成功.如果在报头与消息体之间少了“\r\n\r\n ...
- “脚踢各大Python Web框架”,Sanic真有这能耐么?
在Github上,Sanic第一句介绍语就是: "Sanic is a Flask-like Python 3.5+ web server that's written to go fast ...
- (转载)spring RestTemplate用法详解
前面介绍过spring的MVC结合不同的view显示不同的数据,如:结合json的view显示json.结合xml的view显示xml文档.那么这些数据除了在WebBrowser中用JavaScrip ...
- Amber learning note A8: Loop Dynamics of the HIV-1 Integrase Core Domain
1. Prepare Input File $ tleap >source leaprc.protein.ff14SB ----- Source: /home/wangq/Programs/am ...
- ROSETTA使用技巧随笔--score.sc处理
对score.sc的便利操作: $ sort -n -k2 example_score_file.sc 此命令会以score文件的第二列进行排序(sort -n -k2,-n表示对数值型数据排序,可用 ...
- android 通过页面上关键字快速定位代码
这里定位微信关于页面, 当然可以直接获取当前最顶层activity 反编译apk后 搜索 strings.xml,找到对应id 搜索文件到用到id对应的成员变量,通常 是在R*.smali文件中 字符 ...
- 31.JS实现控制HTML5背景音乐播放暂停
实现控制网站背景音乐的播放暂停在html5中是非常容易和简单的,仅仅几行代码即可实现.首先在网页中嵌入背景音乐,html5代码为: <script src="http://wuover ...
- Hibernate.基础篇《一》.Hibernate工具类.
Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...
- js字符串三个编码的区别
1.escape():编码目的为了防止字符串中特殊字符造成运算错误,主要在字符串运算中使用: 不进行编码的69个字符:A-Z.a-z.0-9.@.*._.+.-...\. 2.encodeURI(): ...