题目:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1004
这题是说,给一个数列,问最少去掉多少个元素可以使这个数列成为前一半严格递增后一半严格递减的数列(前后两半共用中间最大的元素)。比如1,2,3,4,3,4,2,1,去掉第二个4之后得到1,2,3,4,3,2,1。
解法:最长单调子序列。
最长单调子序列求解用到DP,因为最长单调子序列具有最有子结构,例如考虑最优子序列l,如果l由l1、l2两个序列构成,则l1、l2都是原序列以l1最后一个元素为最后元素的序列的最长单调子序列。证明:如果l1或l2不是最优的,则找到最优的l3替换l1或l2,则新形成的序列比原l序列更长,因此l不是最优解,矛盾,因此l1、l2必须是最优解。根据这一性质,从前向后找最优子结构。dp(i)=max(dp(j)),j为0到i-1的,满足in(j)<in(i)的所有整数。
具体到这题首先正反两次求最长单调子结构,然后按照每一位找y=max(dp1(i)+dp2(i))则解为n-(y-1)。
代码:
点击这里下载
Leave a Reply