传送门

第一问直接$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$就不用连了)

然后再跑一次最大流就是第三问的答案

  1. //minamoto
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<queue>
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
  9. char buf[<<],*p1=buf,*p2=buf;
  10. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
  11. inline int read(){
  12. #define num ch-'0'
  13. char ch;bool flag=;int res;
  14. while(!isdigit(ch=getc()))
  15. (ch=='-')&&(flag=true);
  16. for(res=num;isdigit(ch=getc());res=res*+num);
  17. (flag)&&(res=-res);
  18. #undef num
  19. return res;
  20. }
  21. const int N=,M=;
  22. int ver[M],Next[M],head[N],edge[M],cur[N],dep[N],tot=,a[N],dp[N];
  23. int n,m,s,t,ans,len=;
  24. queue<int> q;
  25. inline void add(int u,int v,int e){
  26. ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
  27. ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
  28. }
  29. bool bfs(){
  30. memset(dep,-,sizeof(dep));
  31. while(!q.empty()) q.pop();
  32. for(int i=;i<=*n+;++i) cur[i]=head[i];
  33. q.push(s),dep[s]=;
  34. while(!q.empty()){
  35. int u=q.front();q.pop();
  36. for(int i=head[u];i;i=Next[i]){
  37. int v=ver[i];
  38. if(dep[v]<&&edge[i]){
  39. dep[v]=dep[u]+,q.push(v);
  40. if(v==t) return true;
  41. }
  42. }
  43. }
  44. return false;
  45. }
  46. int dfs(int u,int limit){
  47. if(!limit||u==t) return limit;
  48. int flow=,f;
  49. for(int i=head[u];i;i=Next[i]){
  50. int v=ver[i];
  51. if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
  52. flow+=f,limit-=f;
  53. edge[i]-=f,edge[i^]+=f;
  54. if(!limit) break;
  55. }
  56. }
  57. return flow;
  58. }
  59. void dinic(){
  60. while(bfs()) ans+=dfs(s,inf);
  61. }
  62. int main(){
  63. n=read();
  64. for(int i=;i<=n;++i) a[i]=read(),dp[i]=;
  65. for(int i=;i<=n;++i){
  66. for(int j=;j<i;++j)
  67. if(a[j]<=a[i]) cmax(dp[i],dp[j]+);
  68. cmax(len,dp[i]);
  69. }
  70. printf("%d\n",len);
  71. s=,t=*n+;
  72. for(int i=;i<=n;++i){
  73. if(dp[i]==) add(s,i,);
  74. if(dp[i]==len) add(i+n,t,);
  75. add(i,i+n,);
  76. }
  77. for(int i=;i<=n;++i)
  78. for(int j=;j<i;++j)
  79. if(a[j]<=a[i]&&dp[j]==dp[i]-) add(j+n,i,);
  80. dinic();printf("%d\n",ans);
  81. add(,n+,inf),add(s,,inf);
  82. if(dp[n]==len) add(n,n<<,inf),add(n<<,t,inf);
  83. dinic();printf("%d\n",ans);
  84. return ;
  85. }

洛谷P2766 最长不下降子序列问题(最大流)的更多相关文章

  1. 洛谷 P2766 最长不下降子序列问【dp+最大流】

    死于开小数组的WA?! 第一问n方dp瞎搞一下就成,f[i]记录以i结尾的最长不下降子序列.记答案为mx 第二问网络流,拆点限制流量,s向所有f[i]为1的点建(s,i,1),所有f[i]为mx(i+ ...

  2. 洛谷 [P2766] 最长不下降子序列问题

    啊啊啊,再把MAXN和MAXM搞反我就退役 层次图求不相交路径数 第一问简单DP 第二问想办法把每一个不上升子序列转化成DAG上的一条路径,就转换成了求不相交路径数 因为每一个数只能用一次,所以要拆点 ...

  3. 洛谷P2766 最长不下降子序列问题 网络流_DP

    Code: #include<cstdio> #include<iostream> #include<vector> #include<algorithm&g ...

  4. 洛谷.T22136.最长不下降子序列(01归并排序 分治)

    题目链接 \(Description\) 给定一个长为n的序列,每次可以反转 \([l,r]\) 区间,代价为 \(r-l+1\).要求在\(4*10^6\)代价内使其LIS长度最长,并输出需要操作的 ...

  5. 【24题】P2766最长不下降子序列问题

    网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...

  6. [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)

    P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...

  7. P2766 最长不下降子序列问题 网络流重温

    P2766 最长不下降子序列问题 这个题目还是比较简单的,第一问就是LIS 第二问和第三问都是网络流. 第二问要怎么用网络流写呢,首先,每一个只能用一次,所以要拆点. 其次,我们求的是长度为s的不下降 ...

  8. 洛谷P2766 最长递增子序列问题

    https://www.luogu.org/problemnew/show/P2766 注:题目描述有误,本题求的是最长不下降子序列 方案无限多时输出 n 网络流求方案数,长见识了 第一问: DP 同 ...

  9. P2766 最长不下降子序列问题 网络流

    link:https://www.luogu.org/problemnew/show/P2766 题意 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的 ...

随机推荐

  1. generate_scripts

    echo "#!/usr/bin/env python" >$1echo "#-*- encoding=UTF-8 -*-" >>$1echo ...

  2. spring mvc学习 总体概览

      spring mvc 设计概览   springmvc处理http请求,主要是在web.xml中配置一个dispatcherservlet,然后由此进行拦截并处理请求返回相应,下面就针对源码大体记 ...

  3. asp.net js 存取cookie

    asp.net //传进来的 public BaseController(BaseHttpHandler handler, HttpContext context) // { //根据地址设置cook ...

  4. 关于jquery在页面初始化时radio控件选定默认值的问题

    网上找了很多资料,都是比较旧版本的方法,新版的jquery都已经抛弃了. 正确的代码是 $('input:radio[name="statusRadios"][value=&quo ...

  5. BP算法在minist数据集上的简单实现

    BP算法在minist上的简单实现 数据:http://yann.lecun.com/exdb/mnist/ 参考:blog,blog2,blog3,tensorflow 推导:http://www. ...

  6. UIRect中的Anchor组件

    [UIRect中的Anchor组件] Anchor用于实现粘着功能,寄存于UIRect类中.Anchor的类型有三种: 1.None:不使用跟随功能. 2.Unified:四条边使用相同的Target ...

  7. 171. Excel Sheet Column Number Excel表格的字母转成数字

    [抄题]: Given a column title as appear in an Excel sheet, return its corresponding column number. For ...

  8. InvocationtargetException 类型转换异常

    日期类型转换不了json格式数据 json转换数据的时候可以设置某个字段不需要转换 jsonconfig=new JsonConfig() //{} 内传入不需要转换的字段 jsonconfig.se ...

  9. Linux PulseAudio

    一.简介 Linux的声音系统或许是最无序的子系统部分!作为Server来说,声音无足轻重,无人问津,而作为桌面来说太多的实现方案,各有各的长出和不足,ALSA经过多年的发展,基本统一了Linux声卡 ...

  10. 泊松分布 & 指数分布

    一.泊松分布 日常生活中,大量事件是有固定频率的. 某医院平均每小时出生3个婴儿 某公司平均每10分钟接到1个电话 某超市平均每天销售4包xx牌奶粉 某网站平均每分钟有2次访问 它们的特点就是,我们可 ...