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

引言

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

LIS

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

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

LIS的长度:
maxi=1n{f[i]} max i = 1 n { f [ i ] }

LIS与网络流的联系

考虑一个 n n 个点的图,附加源点 S S 和汇点 T T
对于一对点 i,j 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 >
对于任意一个点 i i
如果 f[i]=1 f [ i ] = 1 ,则连边 <S,i> < S , i >
如果 f[i]= f [ i ] = LIS的长度,则连边 <i,T> < i , T >
发现一个性质:
一个LIS恰好对应了 S S T T 的一条路径!

模型

最大流

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

最小割

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

The End

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

你可能感兴趣的:(学习笔记)