Description

https://loj.ac/problem/6005


Solution

第一问直接dp即可。

第二问:
每个点拆成两个点,一个流进,一个流出,两点之间流量为1,用于保证每个点只被用一次。
从源点向dp值为1的点连边,流量为1,从dp值为最大值的点向汇点连边,流量为1。
可以dp状态转移的两点之间也连边,流量为1。
跑最大流即可。

第三问:
在第二问的基础上将源点向1连的边、1拆出的两个点之间的边、n向汇点连的边流量都增加到 +∞ + ∞ +\infty即可。


Code

/************************************************* Au: Hany01* Date: Jul 11th, 2018* Prob: LOJ6005* Email: hany01@foxmail.com* Inst: Yali High School
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
#define File(a) freopen(a".in", "r", stdin), freopen(a".out", "w", stdout)
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define x first
#define y second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read() {static int _, __; static char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}const int maxn = 505;int n, S, T, e = 1, beg[maxn << 1], nex[maxn * maxn], v[maxn * maxn], ans, d[maxn << 1], gap[maxn << 1], f[maxn * maxn], dp[maxn], mx, a[maxn];inline void add(int uu, int vv, int ff, int fl = 1) {v[++ e] = vv, f[e] = ff, nex[e] = beg[uu], beg[uu] = e;if (fl) add(vv, uu, 0, 0);
}int sap(int u, int flow)
{if (u == T) return flow;int res = flow, t;for (register int i = beg[u]; i; i = nex[i]) if (f[i] && d[u] == d[v[i]] + 1) {t = sap(v[i], min(res, f[i]));f[i] -= t, f[i ^ 1] += t;if (!(res -= t)) return flow;}if (!--gap[d[u]]) d[S] = T;return ++ gap[++ d[u]], flow - res;
}int main()
{
#ifdef hany01File("loj6005");
#endifT = (S = ((n = read()) << 1) + 1) + 1;For(i, 1, n) a[i] = read();For(i, 1, n) {rep(j, i) if (a[i] >= a[j]) chkmax(dp[i], dp[j] + 1);chkmax(mx, dp[i]);}printf("%d\n", mx);For(i, 1, n) {add(i, i + n, 1);if (dp[i] == 1) add(S, i, 1);if (dp[i] == mx) add(i + n, T, 1);For(j, 1, i - 1) if (dp[i] == dp[j] + 1 && a[i] >= a[j]) add(j + n, i, 1);}for (gap[0] = T; d[S] < T; ) ans += sap(S, INF);printf("%d\n", ans);add(1, n + 1, INF), add(n, n << 1, INF);if (dp[n] == mx) add(n << 1, T, INF);for (Set(gap, 0), Set(d, 0), gap[0] = T, add(S, 1, INF); d[S] < T; ) ans += sap(S, INF);printf("%d\n", ans);return 0;
}
//万里无人收白骨,家家城下招魂葬。
//    -- 张籍《征妇怨》

【LOJ6005】【网络流24题】最长递增子序列相关推荐

  1. [网络流24题] 最长递增子序列

    [网络流24题] 最长递增子序列 «问题描述: 给定正整数序列x1,..., xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允 ...

  2. leetcode算法题-- 最长递增子序列的个数★

    原题链接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/ 相关题目:最长上升子序列 lengths ...

  3. 洛谷2766:[网络流24题]最长不下降子序列问题——题解

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

  4. [网络流24题] 最长k可重区间集

    对于区间 u->v ,连接边 u->v,权值为-len,容量为1,之后对每个点 i->i+1,连边 i->i+1,容量为k,权值为0,求区间最左端点到最右端点的费用流,费用相反 ...

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

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

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

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

  7. ★ 最长递增子序列问题 (最多不相交路径)(分层思想) 网络流最大流

    题目描述 Description 给定正整数序列x1,..... , xn  . (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在 ...

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

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

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

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

  10. 算法:经典题五 题目五 信封套娃层数问题 转化为 数组最长递增子序列问题

    输入:一组信封长宽信息 二维数组(假设都是长大于宽的) 输出:套信封层数最多的 信封个数,最多套多少层娃 要点: 第一纬度信息,从小到大排序,第二维信息再从大到小排序,求第二维的最长递增子序列长度就是 ...

最新文章

  1. UI设计培训技术分享:搞定萌萌哒可爱图标
  2. 牛批了,1行python代码就可实现炫酷可视化
  3. 富文本框让最大四百像素_Django2.0.4 结合 KindEditor 4.1.11 富文本编辑器
  4. centos7修改默认网卡名称
  5. bat 修改txt_善用bat命令提高办公效率
  6. 设计模式(七)装饰模式
  7. android 传输日期,Android 跟日期和时间有关的操作
  8. 妙用git rebase --onto指令
  9. ENVI入门系列教程---一、数据预处理---1.2基本操作--5.x以后的界面(旧界面)
  10. stm32变量放在flash_STM32 使用 Flash 存储数据时的一种管理办法
  11. DocumentFormat.OpenXml
  12. 云通讯 发送短信模板代码
  13. javascript学习之路1
  14. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)...
  15. Cisco Packet Tracer基础命令操作以及组织网络实验
  16. MySQL学习(四)——MySQL的登录
  17. 客户端伪造代理服务器ip进行sql注入
  18. 仿真1 - takeoff_land
  19. 主题:分享一个靠谱的免费论文查重网站
  20. 《机器学习》心得体会

热门文章

  1. Image To PDF or XPS V4.2 汉化版,tek2y原创汉化!
  2. 店铺差评有什么影响原因有哪些方面,怎么避免差评,被差评了怎么解决
  3. 一文搞懂css 2D动画效果
  4. 优化问题-Lagrange函数和共轭函数
  5. 学了python还要学什么,学python先学什么
  6. 工业智能网关BL110应用之五:设备选型
  7. JGG专刊征稿:时空组学
  8. 提取QQ游戏图标并显示
  9. 转载收藏 常用数学符号的读法及其含义
  10. Windows程式开发设计指南--图形基础