数组A包含N个整数。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:1 3 2 0 4,1 3 4,1 2 4均为A的LIS。其中元素1和4一定会出现在LIS当中,元素2和3可能会出现在LIS当中,元素0一定不会出现在LIS当中。给出数组A,输出哪些数可能出现在LIS中,哪些数一定出现在LIS中。输出数字对应的下标,下标编号从1开始,编号为1 - N。例如:1 3 2 0 4,可能出现的元素为3和2,对应的下标为2和3。一定出现的元素为1和4,对应下标为1和5.
Input
第1行:1个数N,表示数组的长度。(1 <= N <= 50000)
第2 - N + 1行:每行1个数A[i],表示数组的元素(0 <= A[i] <= 10^9)
Output
第1行:可能出现在LIS中的数的下标,中间用空格分隔。(输出的下标按照递增排序)
第2行:一定会出现在LIS中的数的下标,中间用空格分隔。(输出的下标按照递增排序)
Input示例
5
1
3
2
0
4
Output示例
A:2 3
B:1 5
做法:正着做一遍lis,反着做一遍反lis,然后就可以得到当前序列在lis的位置里。
比如,就拿样例说:
正序:1 2 2 1 3
因为要排除不合法的(比如0),所以要做一遍反向的。
逆序:3 2 2 2 1
把他们加起来就会发现:44434。明显第四位不合法,然后我们排除不合法的以后随便拿一个顺序的,如果一个数出现了一次就是必然的否则就是可能的。
代码比较好打。就不贴了。
51nod 1218 最长递增子序列 V2
最新推荐文章于 2018-09-13 21:30:00 发布