题目描述
«问题描述:
给定正整数序列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再次跑网络流就行了。