引言
《网络流24题》中有这样一题:
给定一个
n
n
个数的序列,
n≤500
n
≤
500
。要求:
(1)求最长上升子序列的长度,记为
s
s
。
(2)求这个序列里最多能选出多少个长度为的上升子序列,每个数最多选出一次。
(3)求这个序列里最多能选出多少个长度为
s
s
的上升子序列,除了第个数和第
n
n
个数之外,每个数最多选出一次。
LIS
LIS是最长上升子序列。可以利用DP求得:
表示以
i
i
为结尾的最长上升子序列。
转移(为序列第
i
i
个数):
LIS的长度:
LIS与网络流的联系
考虑一个
n
n
个点的图,附加源点和汇点
T
T
:
对于一对点,如果
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
,
如果,则连边
<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
到的一条路径!
模型
最大流
如果按上面这样建图,那么,
问题(2)就是询问
S
S
到之间最多能选出多少条路径,要求除
S
S
和之外的每个点至多被选出一次。
问题(3)就是询问
S
S
到之间最多能选出多少条路径,要求除
S,T,1,n
S
,
T
,
1
,
n
之外的每个点至多被选出一次。
由于每个点至多被选出一次,所以要限制每个点流出的流量,因此可以拆点跑最大流来实现。
问题(2)中每条边的容量都为
1
1
。
问题(3)中,只需要将与和
n
n
相关的一些边容量改为。
最小割
问题:BZOJ 3532 / SDOI 2014 Lis
给定序列
A
A
,序列中的每一项有删除代价
Bi
B
i
和附加属性
Ci
C
i
。请删除若干项,使得
A
A
的最长上升子序列长度减少至少,且付出的代价之和最小,并输出方案。
如果有多种方案,请输出将删去项的附加属性排序之后,字典序最小的一种。
相当于在图中删掉若干点,使得
S
S
到没有路径。
拆点最小割可以解决。但输出方案附加各种优先级就不会了QAQ
The End
总之,LIS与网络流的联系:
一个LIS恰好对应了
S
S
到的一条路径。