洛谷 [P2766] 最长不下降子序列问题
啊啊啊,再把MAXN和MAXM搞反我就退役
层次图求不相交路径数
第一问简单DP
第二问想办法把每一个不上升子序列转化成DAG上的一条路径,就转换成了求不相交路径数
因为每一个数只能用一次,所以要拆点
对与dp[i]1连一条从s到i的边,对于dp[i]ans1连一条从i到t的边
对于dp[j]==dp[i]+1,且num[j]>=num[i],连一条从i到j的边,
跑最大流即可
第三问将对应的边容量改为inf即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define inff 0x3f3f3f3f
using namespace std;
const int MAXN=2005,MAXM=500005;
int n,head[MAXN],num[MAXN],dp[MAXN],cur[MAXN],dep[MAXN],nume,s,t,maxflow;
struct edge{
int to,nxt,cap,flow;
}e[MAXM];
void adde(int from,int to,int cap){
e[++nume].to=to;
e[nume].nxt=head[from];
head[from]=nume;
e[nume].cap=cap;
}
//queue<int>q;
bool bfs(){
queue<int> q;
memset(dep,0,sizeof(dep));
q.push(s);dep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!dep[v]&&e[i].flow<e[i].cap){
dep[v]=dep[u]+1;
q.push(v);
}
}
}
return dep[t];
}
int dfs(int u,int flow){
if(u==t) return flow;
int tot=0;
for(int &i=cur[u];i&&tot<flow;i=e[i].nxt){
int v=e[i].to;
if(dep[v]==dep[u]+1&&e[i].flow<e[i].cap){
if(int t=dfs(v,min(flow-tot,e[i].cap-e[i].flow))){
e[i].flow+=t;
e[((i-1)^1)+1].flow+=t;
tot+=t;
}
}
}
return tot;
}
void dinic(){
while(bfs()){
for(int i=s;i<=t;i++) cur[i]=head[i];
maxflow+=dfs(s,0x3f3f3f3f);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
}
s=0;t=n*2+1;
dp[1]=1;
for(int i=2;i<=n;i++){
int ma=0;
for(int j=1;j<i;j++){
if(num[i]>=num[j]) ma=max(ma,dp[j]);
}
dp[i]=ma+1;
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
for(int i=1;i<=n;i++) adde(i,i+n,1),adde(i+n,i,0);
for(int i=1;i<=n;i++){
if(dp[i]==1){
adde(s,i,1);adde(i,s,0);
}
if(dp[i]==ans){
adde(i+n,t,1);adde(t,i+n,0);
}
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(dp[j]==dp[i]+1&&num[j]>=num[i]) adde(i+n,j,1),adde(j,i+n,0);
}
}
dinic();
cout<<maxflow<<endl;
for(int i=head[s];i;i=e[i].nxt) if(e[i].to==1) e[i].cap=inff;
for(int i=head[t];i;i=e[i].nxt) if(e[i].to==n*2) e[((i-1)^1)+1].cap=inff;
e[1].cap=inff;e[n*2-1].cap=inff;
dinic();
cout<<maxflow<<endl;
return 0;
}
洛谷 [P2766] 最长不下降子序列问题的更多相关文章
- 洛谷P2766 最长不下降子序列问题(最大流)
传送门 第一问直接$dp$解决,求出$len$ 然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边 然后 ...
- 洛谷 P2766 最长不下降子序列问【dp+最大流】
死于开小数组的WA?! 第一问n方dp瞎搞一下就成,f[i]记录以i结尾的最长不下降子序列.记答案为mx 第二问网络流,拆点限制流量,s向所有f[i]为1的点建(s,i,1),所有f[i]为mx(i+ ...
- 洛谷P2766 最长不下降子序列问题 网络流_DP
Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm&g ...
- 洛谷.T22136.最长不下降子序列(01归并排序 分治)
题目链接 \(Description\) 给定一个长为n的序列,每次可以反转 \([l,r]\) 区间,代价为 \(r-l+1\).要求在\(4*10^6\)代价内使其LIS长度最长,并输出需要操作的 ...
- 【24题】P2766最长不下降子序列问题
网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...
- [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)
P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...
- P2766 最长不下降子序列问题 网络流重温
P2766 最长不下降子序列问题 这个题目还是比较简单的,第一问就是LIS 第二问和第三问都是网络流. 第二问要怎么用网络流写呢,首先,每一个只能用一次,所以要拆点. 其次,我们求的是长度为s的不下降 ...
- 洛谷P2766 最长递增子序列问题
https://www.luogu.org/problemnew/show/P2766 注:题目描述有误,本题求的是最长不下降子序列 方案无限多时输出 n 网络流求方案数,长见识了 第一问: DP 同 ...
- P2766 最长不下降子序列问题 网络流
link:https://www.luogu.org/problemnew/show/P2766 题意 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的 ...
随机推荐
- poj_3070Fibonacci(矩阵快速幂)
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12732 Accepted: 9060 Descri ...
- JAVA虚拟机之对象探秘
上一章主要写到了JVM中运行时数据区域各个部分的功能及其作用.上一章说到了对象是分配在堆上面的,所以接下来我们写到对象在堆内存中是如何创建.如何布局.如何访问.1. 对象的创建 在java程序中对象的 ...
- [20160711][VS2012配置OpenCV2.4.9]
相关说明 OpenCV是一套开源机器视觉库,用于简化机器视觉算法的开发与调试. 移植环境 操作系统:Win7 64位 移植软件:Visual Studio 2012 代码下载: https://sou ...
- css3渐变之线性渐变
css3定义了两种类型的渐变,即线性渐变和径向渐变.这里我要说的是线性渐变. 为了创建一个线性渐变,你必须至少定义两种颜色结点.颜色结点即你想要呈现平稳过渡的颜色.同时,你也可以设置一个起点和一个方向 ...
- javascript 思维导图 总结
项目接近尾声,闲暇时间对JavaScript的总结,包含数组的一些知识(创建.访问.关联数组,数组API,以及二维数组).js的内置对象.面向对象概念和特征.以及部分ES5特性. 大纲如图: 如需可下 ...
- [基础常识]申请免费SSL证书 - 阿里云云盾证书 - Digicert+Symantec 免费型DV SSL
https://bbs.aliyun.com/read/573933.html?spm=5176.10695662.1996646101.searchclickresult.72be06dct9Qvw ...
- parse_url 解析 URL,返回其组成部分
parse_url - 解析 URL,返回其组成部分 array parse_url ( string $url [, int $component = -1 ] ) 本函数解析一个 URL 并返回一 ...
- // 关闭调试模式 define('APP_DEBUG', false);
调试模式的优势在于: 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试: 关闭模板缓存,模板修改可以即时生效: 记录SQL日志,方便分析SQL: 关闭字段缓存,数据表字段修改不受缓存影响: ...
- openfire服务器+Spark搭建即时聊天系统 & 阿里云的初步探索
晚上出去和洋仔吃了涮肉,喝了点啤酒,不知不觉就聊到了11点,感觉他工作状态还不错,emmm...都要加油吧.虽然没有当时去山西零下二十多度那么夸张,这几天北京的冬夜还是有点小冷的.好了进入正题: 一. ...
- IE调试网页之三:使用 F12 工具控制台查看错误和状态 (Windows)
IE调试网页之三:使用 F12 工具控制台查看错误和状态 (Windows) 等 请见博客园的 我的收藏