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

这个图即可。

对于询问三,更简单,

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

转载于:https://www.cnblogs.com/fengzhiyuan/p/7927543.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值