动态规划 最长上升子序列
2018-03-30 09:42
323 查看
给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)
给定
给定
首先用动态规划来解决此类问题
动态规划一般解题步骤:
①找出状态转移方程
②解决边界问题
状态转移方程:
我们用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)
给定
[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)
相关文章推荐
- 动态规划之编号动态规划:hdu 1025(dp+二分 求最长上升子序列)
- 动态规划之一最长上升子序列LIS
- 动态规划-最长上升子序列(LIS)
- 动态规划——最长上升子序列
- 动态规划:最长上升子序列
- 动态规划-最长上升子序列(LIS)
- 070day(动态规划思路,例题(最长上升子序列)和流操纵算子)
- 动态规划--最长上升子序列LIS
- poj 1836 (动态规划之最长上升子序列)
- 动态规划——最长上升子序列
- 动态规划——最长公共上升子序列LCIS
- 动态规划之最大公共序列+最长上升子序列
- 动态规划 01 (最长上升子序列)
- 动态规划 最长公共子序列 最长上升子序列 最长上升公共子序列
- 动态规划-最长上升子序列(LIS)
- 动态规划—最长公共上升子序列
- 算法学习之动态规划--最长上升子序列
- 动态规划4_最长上升子序列
- 动态规划-最长上升子序列(LIS)
- POJ1631——Bridging signals(动态规划,最长上升子序列应用)