[学习笔记]浅谈LIS(最长上升子序列)与网络流

引言

《网络流24题》中有这样一题:
给定一个 n n 个数的序列a n500 n ≤ 500 。要求:
(1)求最长上升子序列的长度,记为 s s
(2)求这个序列里最多能选出多少个长度为s的上升子序列,每个数最多选出一次。
(3)求这个序列里最多能选出多少个长度为 s s 的上升子序列,除了第1个数和第 n n 个数之外,每个数最多选出一次。

LIS

LIS是最长上升子序列。可以利用DP求得:
f[i]表示以 i i 为结尾的最长上升子序列。
转移(Ai为序列第 i i 个数):

f[i]=maxj<i,Aj<Ai{f[j]}+1

LIS的长度:

maxi=1n{f[i]} max i = 1 n { f [ i ] }

LIS与网络流的联系

考虑一个 n n 个点的图,附加源点S和汇点 T T
对于一对点i,j,如果 i<j and Ai<Aj and f[i]+1=f[j] i < j  and  A i < A j  and  f [ i ] + 1 = f [ j ] ,则连边 <i,j> < i , j > <script type="math/tex" id="MathJax-Element-20"> </script>。
对于任意一个点 i i
如果f[i]=1,则连边 <S,i> < S , i > <script type="math/tex" id="MathJax-Element-23"> </script>。
如果 f[i]= f [ i ] = LIS的长度,则连边 <i,T> < i , T > <script type="math/tex" id="MathJax-Element-25"> </script>。
发现一个性质:
一个LIS恰好对应了 S S T的一条路径!

模型

最大流

如果按上面这样建图,那么,
问题(2)就是询问 S S T之间最多能选出多少条路径,要求除 S S T之外的每个点至多被选出一次。
问题(3)就是询问 S S T之间最多能选出多少条路径,要求除 S,T,1,n S , T , 1 , n 之外的每个点至多被选出一次。
由于每个点至多被选出一次,所以要限制每个点流出的流量,因此可以拆点跑最大流来实现。
问题(2)中每条边的容量都为 1 1
问题(3)中,只需要将与1 n n 相关的一些边容量改为

最小割

问题:BZOJ 3532 / SDOI 2014 Lis
给定序列 A A ,序列中的每一项Ai有删除代价 Bi B i 和附加属性 Ci C i 。请删除若干项,使得 A A 的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。
相当于在图中删掉若干点,使得 S S T没有路径。
拆点最小割可以解决。但输出方案附加各种优先级就不会了QAQ

The End

总之,LIS与网络流的联系:
一个LIS恰好对应了 S S T的一条路径。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值