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

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再次跑网络流就行了。

posted @ 2018-10-18 07:28  342  阅读(162)  评论(0编辑  收藏  举报