【网络流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,其间连一条流量为一的边,限制了这个点只能经过一次。

【网络流24题】最长递增子序列问题(最多不相交路径)

这个图即可。

对于询问三,更简单,

将起点的流量与终点流量改为无穷大即可。