【网络流24题】最长递增子序列问题(最多不相交路径)
题目描述
«问题描述:
给定正整数序列x1,...,xn 。
(1)计算其最长递增子序列的长度s。
(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列。
(3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列。
«编程任务:
设计有效算法完成(1)(2)(3)提出的计算任务。
输入输出格式
输入格式:
第1 行有1个正整数n,表示给定序列的长度。接下来的1 行有n个正整数n:x1, ..., xn。
输出格式:
第1 行是最长递增子序列的长度s。第2行是可取出的长度为s 的递增子序列个数。第3行是允许在取出的序列中多次使用x1和xn时可取出的长度为s 的递增子序列个数。
输入输出样例
输入样例#1:
4 3 6 2 5
输出样例#1:
2 2 3
第一问是十分简单的,简单的dp,设为f数组
这时的f[i]表示到i可以得到的最大长度。(就是在维护那个单调栈中该数时第几个位置)
如3 6 2 7
3 是第一个位置
6 是第二个位置
2 是代替了3 第一个位置
7 是第三个位置
所以f数组为 1 2 1 3
这个意思
对于样例 3 6 2 5
对于第二问如何建图呢?
将每个点拆开分成两个点,a.st,a.ed,其间连一条流量为一的边,限制了这个点只能经过一次。
这个图即可。
对于询问三,更简单,
将起点的流量与终点流量改为无穷大即可。