题目描述

传送门
题目的bug:
1、数据范围没给,不过目测随便开一下就好了
2、其实是最长不下降子序列
3、如果直接递减的话后两问输出n

题解

拆点
把一个点拆成两个点来保证每个点用的次数。
关系的转移
dp之后发现必须满足i在j之前,i的值小于等于j的值并且dp出来的长度i+1=j的时候才能从i向j连边。
连向源点、汇点的边注意一下,并且可以当做起点和当做终点的点的边的容量注意一下,可以控制使用的次数。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;const int max_n=10000005;
const int inf=1e9;int n,ans,maxflow,N;
int a[max_n],f[max_n];
int next[max_n],point[max_n],v[max_n],remain[max_n],tot;
int cur[max_n],deep[max_n],last[max_n],num[max_n];
queue <int> q;inline int dp(){f[1]=1;for (int i=2;i<=n;++i){for (int j=1;j<i;++j)if (a[i]>=a[j]&&f[i]<f[j]) f[i]=f[j];f[i]++;}int ans=f[1];for (int i=2;i<=n;++i)ans=max(ans,f[i]);return ans;
}inline void clear(){tot=-1;memset(point,-1,sizeof(point));memset(next,-1,sizeof(next));maxflow=0;
}inline void add(int x,int y,int cap){++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; remain[tot]=cap;++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; remain[tot]=0;
}inline void bfs(int t){for (int i=1;i<=N;++i)deep[i]=N;deep[t]=0;for (int i=1;i<=N;++i)cur[i]=point[i];while (!q.empty()) q.pop();q.push(t);while (!q.empty()){int now=q.front(); q.pop();for (int i=point[now];i!=-1;i=next[i])if (deep[v[i]]==N&&remain[i^1]){deep[v[i]]=deep[now]+1;q.push(v[i]);}}
}inline int addflow(int s,int t){int ans=inf,now=t;while (now!=s){ans=min(ans,remain[last[now]]);now=v[last[now]^1];}now=t;while (now!=s){remain[last[now]]-=ans;remain[last[now]^1]+=ans;now=v[last[now]^1];}return ans;
}inline void isap(int s,int t){bfs(t);for (int i=1;i<=N;++i)num[deep[i]]++;int now=s;while (deep[s]<N){if (now==t){maxflow+=addflow(s,t);now=s;}bool has_find=false;for (int i=cur[now];i!=-1;i=next[i])if (deep[v[i]]+1==deep[now]&&remain[i]){has_find=true;cur[now]=i;last[v[i]]=i;now=v[i];break;}if (!has_find){int minn=N-1;for (int i=point[now];i!=-1;i=next[i])if (remain[i])minn=min(minn,deep[v[i]]);if (!(--num[deep[now]])) break;num[deep[now]=minn+1]++;cur[now]=point[now];if (now!=s)now=v[last[now]^1];}}
}inline void doit_1(){clear();//build upN=n*2+2;for (int i=1;i<=n;++i){if (f[i]==1)add(1,i+1,1);if (f[i]==ans)add(i+n+1,N,1);add(i+1,i+n+1,1);}for (int i=2;i<=n;++i)for (int j=1;j<i;++j)if (a[i]>=a[j]&&f[i]==f[j]+1)add(j+n+1,i+1,1);isap(1,N);printf("%d\n",maxflow);
}inline void doit_n(){clear();N=n*2+2;for (int i=1;i<=n;++i){if (f[i]==1)add(1,i+1,inf),add(i+1,i+n+1,inf);elseif (f[i]==ans)add(i+n+1,N,inf),add(i+1,i+n+1,inf);elseadd(i+1,i+n+1,1);}for (int i=2;i<=n;++i)for (int j=1;j<i;++j)if (a[i]>=a[j]&&f[i]==f[j]+1)add(j+n+1,i+1,1);isap(1,N);printf("%d\n",maxflow);
}int main(){scanf("%d",&n);for (int i=1;i<=n;++i)scanf("%d",&a[i]);ans=dp();printf("%d\n",ans);if (ans==1)printf("%d\n",n);else doit_1();if (ans==1)printf("%d\n",n);else doit_n();
} 

[网络流24题][codevs1906]最长递增子序列(dp+isap)相关推荐

  1. 【刷题】LOJ 6005 「网络流 24 题」最长递增子序列

    题目描述 给定正整数序列 \(x_1 \sim x_n\) ,以下递增子序列均为非严格递增. 计算其最长递增子序列的长度 \(s\) . 计算从给定的序列中最多可取出多少个长度为 \(s\) 的递增子 ...

  2. [网络流24题] 06 最长递增子序列(最多不相交路径,最大流)

    题目大意: 给定正整数序列x1,..., xn. (1):计算其最长递增子序列的长度s(非降). (2):计算从给定的序列中最多可去除多少个长度为s的递增子序列. (3):如果允许在取出的序列中多次使 ...

  3. 【LOJ6005】【网络流24题】最长递增子序列

    Description https://loj.ac/problem/6005 Solution 第一问直接dp即可. 第二问: 每个点拆成两个点,一个流进,一个流出,两点之间流量为1,用于保证每个点 ...

  4. 牛客题霸 [ 最长递增子序列] C++题解/答案

    牛客题霸 [ 最长递增子序列] C++题解/答案 题目描述 给定数组arr,设长度为n,输出arr的最长递增子序列.(如果有多个答案,请输出其中字典序最小的) 题意: 直接暴力会超时 应该用二分+贪心 ...

  5. LeetCode高频题300. 最长递增子序列

    LeetCode高频题300. 最长递增子序列 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批A ...

  6. 51nod1134最长递增子序列(dp)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 这里说下,最长上升子序列和最长不降子序列几乎一样,只是判 ...

  7. 【刷题】LOJ 6014 「网络流 24 题」最长 k 可重区间集

    题目描述 给定实直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取出开区间集合 \(S \subseteq ...

  8. 网络流24题之最长k可重区间集问题

    对于每个点向后一个点连流量为k费用为0的边 对每一区间连l到r流量为1费用为r-l的边 然后最小费用最大流,输出取反 一开始写的r-l+1错了半天... By:大奕哥 1 #include<bi ...

  9. 最长单调递增子序列_最长递增子序列(动态规划 + 二分搜索)

    题目 给定数组arr,返回arr的最长递增子序列 举例:arr = [2,1,5,3,6,4,8,9,7],返回的最长递增子序列为[1,3,4,8,9] 要求:如果arr的长度为N,请实现时间复杂度为 ...

最新文章

  1. Windows Server 2008与2012建立林信任关系
  2. 终于!有本书把我从“看完就忘、死记硬背”的学习困境中拯救出来了!
  3. 【FPGA】Buffer专题介绍(一)
  4. Android版本更新踩坑,Android Studio 3.0升级后踩到的坑
  5. php免登录接口,PHPWind 8.0 论坛免登陆发布接口发布
  6. 光端机和光纤交换机的区别?
  7. 要闻君说:台积电将为iPhone生产5纳米A系列芯片?腾讯云TStack与银河麒麟完成互认证……...
  8. Linux系统初学者指南,观点|Linux 系统调用的初学者指南
  9. Qt工作笔记-可拖动大小的QListWidget(自定义控件方式)
  10. 基于deepin-wine的windows软件打包deb安装包教程
  11. JavaScript学习总结(14)——12个令人惊叹的JavaScript技巧
  12. 微信公开课讲师黄咪咪:熟读规则,玩转小游戏
  13. 实体与表映射关系XXX.hbm.xml配置详解(转)
  14. 汇编语言数据段查找ASCII码并回显
  15. couchbase导出mysql
  16. 3.3 RESET and Initialization Procedure
  17. 为什么犹太人能出这么多诺贝尔奖,看看他们的家庭教育吧!
  18. vue截取一个字符串_字符串截取方法
  19. 【C++】针对char 字符类型cout的三种输出情况(++ch 和 ch+1 和 ch++)难点加重点
  20. c语言龟兔赛跑程序,c语言龟兔赛跑

热门文章

  1. 【百日刷题计划 第九天】——熟悉字符串 字符串基础题
  2. VOGUE: Secure User Voice Authentication on Wearable Devices using Gyroscope
  3. 关于不能远程桌面到我的电脑的问题
  4. CoOS使用教程——事件标志
  5. 微信整合支付和退款以及回掉
  6. ss: Display Linux TCP / UDP Network and Socket ...
  7. 【JavaScript 逆向】知乎 jsvmp,x-zse-96 参数 3.0 分析
  8. 插入排序 --- 附图解(C语言)
  9. 背靠巨头阿里的淘菜菜,能在社区团购赛道走多远?
  10. NVIDIA发布Tegra 4:四核A15+72核心GPU