您的位置:首页 > 其它

动态规划 最长上升子序列

2018-03-30 09:42 323 查看
给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)

给定
[5, 4, 2, 1, 3]
, 其最长上升连续子序列(LICS)为
[5, 4, 2, 1]
, 返回
4
.
给定
[5, 1, 2, 3, 4]
, 其最长上升连续子序列(LICS)为
[1, 2, 3, 4]
, 返回
4
.
首先用动态规划来解决此类问题
动态规划一般解题步骤:
①找出状态转移方程
②解决边界问题
状态转移方程:
我们用record来存储长度,record_inc[i]存储最后一个元素为A[i]的上升子序列的长度,record_dec[i]存储最后一个元素为A[i]的下降子序列的长度。所以可得到状态转移方程为:
当A[i]>A[i-1]时,record_inc[i] = record_inc[i - 1] + 1, record_dec[i] = 1
当A[i] < A[i - 1],record_dec[i] = record_dec[i - 1] + 1, record_inc[i] = 1.
所以贴代码:
 m = len(A)
        if m==0:
            return 0
        record_inc, record_des = [1],[1]
        cur = 1
        while cur<m:
            if A[cur]>A[cur-1]:
                record_inc.append(record_inc[-1]+1)
                record_des.append(1)
            else:
                record_des.append(record_des[-1]+1)
                record_inc.append(1)
            cur+=1
        t1 = max(record_inc)
        t2 = max(record_des)
        
        return max(t1,t2)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: