码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-10-18 10:59:21      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:输入输出格式   反向   red   取出   答案   就是   alt   org   分享   

P2766 最长不下降子序列问题

题目描述

?问题描述:

给定正整数序列x1,...,xn 。

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

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

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

?编程任务:

设计有效算法完成(1)(2)(3)提出的计算任务。

n<=500

输入输出格式

输入格式:

第1 行有1个正整数n,表示给定序列的长度。接下来的1 行有n个正整数n:x1, ..., xn。

输出格式:

第1 行是最长不下降子序列的长度s。

第2行是可取出的长度为s 的不下降子序列个数。

第3行是允许在取出的序列中多次使用x1和xn时可取出的长度为s 的不下降子序列个数。

输入样例:

4

3 6 2 5

输出样例:

2

2

3

第一问可以n2DP,而nlogn不行,为什么?

因为在n2DP中f[i]表示以这个数为末尾前i个数最长不下降子序列的长度。

但是nlogn仅仅存储了前几个数,之后求出全局答案。

第2问和第3问就用到了这个东西。

还是那句话:建模真的很难

把一个点拆成2个点,编号为i和i+n正向连一条边权为1的边,反向连一条边权为0的边,可以反悔。之后建一个超级原点和超级汇点把f[i]=第一问的ans的点连一条边。

技术分享图片

之后跑网络流就行了。

第3问就是把1和原点,n和汇点边权设成inf再次跑网络流就行了。

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

标签:输入输出格式   反向   red   取出   答案   就是   alt   org   分享   

原文地址:https://www.cnblogs.com/342zhuyongqi/p/9808290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!