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; ...
随机推荐
- Ext.create细节分析
var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...
- 17-Python3 循环语句
2018-11-21 18:23:56 print('pass语句') for letter in 'Runoob': if letter=='o': pass else: print(letter) ...
- mac本的环境基本完成大部分了
1.禅道的部署,技术上最难搞 session 目录存储目录不存在的处理 终端:open /et 前往——>前往文件夹——〉/资源库/WebServer/Documents/ 在tem目录下新建文 ...
- Linux和windows 查看程序、进程的依赖库的方法
Linux: 1. 利用ldd查看可执行程序的依赖库 [root@~]# ldd /usr/local/php/bin/php linux-vdso.so.1 => (0x00007ff ...
- linux申请strace ,lstrace, ptrace, dtrace
ltrace命令是用来跟踪进程调用库函数的情况. ltrace -hUsage: ltrace [option ...] [command [arg ...]]Trace library calls ...
- 关于微信分享的一些心得之recommend.js(直接复制就行)
// import $ from 'jquery'import Vue from 'vue'export default function (type,title,con,img,url,) { / ...
- Cocos Creator scrollview添加事件的两种方法
scrollview添加事件 方法一这种方法添加的事件回调和使用编辑器添加的事件回调是一样的,通过代码添加, 你需要首先构造一个 cc.Component.EventHandler 对象,然后设置好对 ...
- 强力上攻后,缓解期结束,MACD死叉的案例
eg1.顶部,MACD收紧,缓解期刚过,正好下M5,触发减仓条件
- shell文件的编写
见文章http://www.cnblogs.com/handsomecui/p/5869361.html
- python3(socket 实现udp,tcp套接字编程)
#coding=utf-8 #客户端程序TCP 连接 import socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connec ...