洛谷P2766 最长不下降子序列问题(最大流)
第一问直接$dp$解决,求出$len$
然后用$f[i]$表示以$i$为结尾的最长不下降子序列长度,把每一个点拆成$A_i,B_i$两个点,然后从$A_i$向$B_i$连容量为$1$的边
然后考虑$f[i]$,如果$f[i]==1$,则从$s$向$A_i$连边,如果$f[i]==len$,那么从$B_i$向$t$连边
然后将每一个$j<i,f[j]+1==f[i],a[j]\leq a[i]$的$j$向$i$连边
以上容量全为$1$
建完图之后跑一个最大流
这样可以保证分层图里选出来的不下降子序列长度必为$len$
然后第三问的话,就把关于$1$和$n$的容量限制给取消掉就好了,就是$s$向$A_1$连$inf$,$A_1$向$B_1$连$inf$,$A_n$向$B_n$连$inf$,$B_n$向$t$连$inf$(如果$f[n]!=len$就不用连了)
然后再跑一次最大流就是第三问的答案
- //minamoto
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<queue>
- #define inf 0x3f3f3f3f
- using namespace std;
- #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
- char buf[<<],*p1=buf,*p2=buf;
- template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
- inline int read(){
- #define num ch-'0'
- char ch;bool flag=;int res;
- while(!isdigit(ch=getc()))
- (ch=='-')&&(flag=true);
- for(res=num;isdigit(ch=getc());res=res*+num);
- (flag)&&(res=-res);
- #undef num
- return res;
- }
- const int N=,M=;
- int ver[M],Next[M],head[N],edge[M],cur[N],dep[N],tot=,a[N],dp[N];
- int n,m,s,t,ans,len=;
- queue<int> q;
- inline void add(int u,int v,int e){
- ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
- ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
- }
- bool bfs(){
- memset(dep,-,sizeof(dep));
- while(!q.empty()) q.pop();
- for(int i=;i<=*n+;++i) cur[i]=head[i];
- q.push(s),dep[s]=;
- while(!q.empty()){
- int u=q.front();q.pop();
- for(int i=head[u];i;i=Next[i]){
- int v=ver[i];
- if(dep[v]<&&edge[i]){
- dep[v]=dep[u]+,q.push(v);
- if(v==t) return true;
- }
- }
- }
- return false;
- }
- int dfs(int u,int limit){
- if(!limit||u==t) return limit;
- int flow=,f;
- for(int i=head[u];i;i=Next[i]){
- int v=ver[i];
- if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
- flow+=f,limit-=f;
- edge[i]-=f,edge[i^]+=f;
- if(!limit) break;
- }
- }
- return flow;
- }
- void dinic(){
- while(bfs()) ans+=dfs(s,inf);
- }
- int main(){
- n=read();
- for(int i=;i<=n;++i) a[i]=read(),dp[i]=;
- for(int i=;i<=n;++i){
- for(int j=;j<i;++j)
- if(a[j]<=a[i]) cmax(dp[i],dp[j]+);
- cmax(len,dp[i]);
- }
- printf("%d\n",len);
- s=,t=*n+;
- for(int i=;i<=n;++i){
- if(dp[i]==) add(s,i,);
- if(dp[i]==len) add(i+n,t,);
- add(i,i+n,);
- }
- for(int i=;i<=n;++i)
- for(int j=;j<i;++j)
- if(a[j]<=a[i]&&dp[j]==dp[i]-) add(j+n,i,);
- dinic();printf("%d\n",ans);
- add(,n+,inf),add(s,,inf);
- if(dp[n]==len) add(n,n<<,inf),add(n<<,t,inf);
- dinic();printf("%d\n",ans);
- return ;
- }
洛谷P2766 最长不下降子序列问题(最大流)的更多相关文章
- 洛谷 P2766 最长不下降子序列问【dp+最大流】
死于开小数组的WA?! 第一问n方dp瞎搞一下就成,f[i]记录以i结尾的最长不下降子序列.记答案为mx 第二问网络流,拆点限制流量,s向所有f[i]为1的点建(s,i,1),所有f[i]为mx(i+ ...
- 洛谷 [P2766] 最长不下降子序列问题
啊啊啊,再把MAXN和MAXM搞反我就退役 层次图求不相交路径数 第一问简单DP 第二问想办法把每一个不上升子序列转化成DAG上的一条路径,就转换成了求不相交路径数 因为每一个数只能用一次,所以要拆点 ...
- 洛谷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)计算从给定的 ...
随机推荐
- generate_scripts
echo "#!/usr/bin/env python" >$1echo "#-*- encoding=UTF-8 -*-" >>$1echo ...
- spring mvc学习 总体概览
spring mvc 设计概览 springmvc处理http请求,主要是在web.xml中配置一个dispatcherservlet,然后由此进行拦截并处理请求返回相应,下面就针对源码大体记 ...
- asp.net js 存取cookie
asp.net //传进来的 public BaseController(BaseHttpHandler handler, HttpContext context) // { //根据地址设置cook ...
- 关于jquery在页面初始化时radio控件选定默认值的问题
网上找了很多资料,都是比较旧版本的方法,新版的jquery都已经抛弃了. 正确的代码是 $('input:radio[name="statusRadios"][value=&quo ...
- BP算法在minist数据集上的简单实现
BP算法在minist上的简单实现 数据:http://yann.lecun.com/exdb/mnist/ 参考:blog,blog2,blog3,tensorflow 推导:http://www. ...
- UIRect中的Anchor组件
[UIRect中的Anchor组件] Anchor用于实现粘着功能,寄存于UIRect类中.Anchor的类型有三种: 1.None:不使用跟随功能. 2.Unified:四条边使用相同的Target ...
- 171. Excel Sheet Column Number Excel表格的字母转成数字
[抄题]: Given a column title as appear in an Excel sheet, return its corresponding column number. For ...
- InvocationtargetException 类型转换异常
日期类型转换不了json格式数据 json转换数据的时候可以设置某个字段不需要转换 jsonconfig=new JsonConfig() //{} 内传入不需要转换的字段 jsonconfig.se ...
- Linux PulseAudio
一.简介 Linux的声音系统或许是最无序的子系统部分!作为Server来说,声音无足轻重,无人问津,而作为桌面来说太多的实现方案,各有各的长出和不足,ALSA经过多年的发展,基本统一了Linux声卡 ...
- 泊松分布 & 指数分布
一.泊松分布 日常生活中,大量事件是有固定频率的. 某医院平均每小时出生3个婴儿 某公司平均每10分钟接到1个电话 某超市平均每天销售4包xx牌奶粉 某网站平均每分钟有2次访问 它们的特点就是,我们可 ...