【网络流24题】 最长不下降子序列问题

本文介绍如何利用网络流算法解决最长不下降子序列的第二、三问。首先,对于第一问,是普及组问题。第二、三问通过建立超级源点和超级汇点,并将点变成边来限制每个元素只能使用一次。详细说明了连接边的规则,并给出了代码实现。

题意:

给定正整数序列x1,...,xnx_1,...,x_nx1,...,xn

(1)计算其最长不下降子序列的长度 sss

(2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列。

(3)如果允许在取出的序列中多次使用 x1x_1x1xnx_nxn,则从给定序列中最多可取出多少个长度为 sss 的不下降子序列。

分析

第一问,普及组问题。
第二,三问,要用网络流解决。

第二问

建立超级源点 SSS 和超级汇点 TTT
我们为了让 SSSTTT 的路径是一条满足长度为 sss 的最长不下降子序列,于是要将 fj=fi+1f_j=f_i + 1fj=fi+1iiijjj 连一条边。这样子从 sssttt 的一个流表示的是一个长度为 sss 的最长不下降子序列。
可问题来了,每个点只能走一次,这个怎么解决呢?
有一个常用的技巧,就是将点变成边,具体实现是将点变成拆成两个点,中间连一条容量为 111 的边,表示这条边只能走一次。
然后连边细节如下:
①:对每个点 iii,从 iiii′i

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值