beloved_ACM

SB,NB,都是一个B.
posts - 29, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

最长递增子序列

Posted on 2010-10-08 22:16 成幸毅 阅读(1501) 评论(2)  编辑 收藏 引用
   问题描述:给定正整数序列x1,x2,....,xn。要求
   1)计算最长递增子序列的长度s。
   2)计算从给定的序列中最多可取出多少长度为s的递增子序列。
   3)如果允许在去除的序列中多次使用x1和xn,则从给定序列中最多可取出长度为s的递增子序列。
   解题报告: 

首先动态规划求出F[i],表示以第i位为开头的最长上升序列的长度,求出最长上升序列长度K

1、把序列每位i拆成两个点<i.a><i.b>,从<i.a><i.b>连接一条容量为1的有向边。

2、建立附加源S和汇T,如果序列第i位有F[i]=K,从S<i.a>连接一条容量为1的有向边。

3、如果F[i]=1,从<i.b>T连接一条容量为1的有向边。

4、如果j>iA[i] < A[j]F[j]+1=F[i],从<i.b><j.a>连接一条容量为1的有向边。

求网络最大流,就是第二问的结果。把边(<1.a>,<1.b>)(<N.a>,<N.b>)(S,<1.a>)(<N.b>,T)这四条边的容量修改为无穷大,再求一次网络最大流,就是第三问结果。

上述建模方法是应用了一种分层图的思想,把图每个顶点i按照F[i]的不同分为了若干层,这样图中从S出发到T的任何一条路径都是一个满足条件的最长上升子序列。由于序列中每个点要不可重复地取出,需要把每个点拆分成两个点。单位网络的最大流就是增广路的条数,所以最大流量就是第二问结果。第三问特殊地要求x1xn可以重复使用,只需取消这两个点相关边的流量限制,求网络最大流即可。

Feedback

# re: 最长递增子序列  回复  更多评论   

2011-06-20 20:12 by 王元达
程序非常不错,很详细

# re: 最长递增子序列  回复  更多评论   

2013-07-29 11:15 by passerby
@王元达
thx

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理