题目链接
题目类型:DP + DFS
题目来源:BestCoder #16
题目分析
题目大意
最长上升子序列的复仇。
给出n个数,问第二长的上升子序列的长度是多少。
解析
我的做法是,跑一遍O(n2)的LIS,对于位置i,每次回溯到j的时候记录共有多少个值能到达当前DP的最大值dp[i],然后将它们加入v[i]的vector里,这样就能保证找到所有到达i位置使dp[i]最大的前一个位置的下标。最后跑完之后看最大值是否出现两次,如果出现两次则必然存在另一个序列也能达到mx的长度。否则DFS从最后一位向前回溯最长子序列,看看是否从最后到达最前面只有一条路径,如果回溯到了子序列的第一个位置,那么说明这个能达到这个长度的子序列唯一,否则若有两个位置可以到达该位置,则该长度的子序列必不唯一。
给出几组数据
1 | 10 5 1 2 2 3 4 6 3 1 2 2 3 4 5 3 1 2 3 4 2 1 1 4 1 2 3 4 5 1 1 2 2 2 6 1 2 2 5 6 3 |
代码
1 |
|