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

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

题意:

给定正整数序列 x 1 , . . . , x n x_1,...,x_n x1,...,xn

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

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

(3)如果允许在取出的序列中多次使用 x 1 x_1 x1 x n x_n xn,则从给定序列中最多可取出多少个长度为 s s s 的不下降子序列。

分析

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

第二问

建立超级源点 S S S 和超级汇点 T T T
我们为了让 S S S T T T 的路径是一条满足长度为 s s s 的最长不下降子序列,于是要将 f j = f i + 1 f_j=f_i + 1 fj=fi+1 i i i j j j 连一条边。这样子从 s s s t t t 的一个流表示的是一个长度为 s s s 的最长不下降子序列。
可问题来了,每个点只能走一次,这个怎么解决呢?
有一个常用的技巧,就是将点变成边,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值