NC91 最长上升子序列
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# retrun the longest increasing subsequence
# @param arr int整型一维数组 the array
# @return int整型一维数组
#
class Solution:
def LIS(self , arr: List[int]) -> List[int]:
# write code here
# DP:
# P(i,j)=第i到第j的substring的最优解
# P(i,j)到P(i, j+1)的转移关系为
# P(i, j+1) = max(P(i,i)~P(i,j)中数值中符合小于第j+1的数值条件的最优解) +1
# 否则如果没有符合条件的话, 即前面没有小于j+1数值的数, P(i, j+1) = 1
# 原因: P(i, j+1)当前最优解是依赖前面P(i,i)~P(i,j) 这些最优解中符合条件的最优解
dp = [1]*len(arr)
max_val_idx = 0
max_val = 1
for j in range(1, len(arr)):
for i in range(0, j):
if arr[j] > arr[i]:
dp[j] = max(dp[i]+1, dp[j])
if max_val < dp[j]:
max_val = dp[j]
max_val_idx = j
print(dp)
z=0
cur_dp = 1
res =[]
while z <= max_val_idx:
if dp[z] > cur_dp:
res.append(arr[z])
cur_dp = dp[z]
pass
elif dp[z] == cur_dp:
if len(res)==0:
res.append(arr[z])
else:
if res[-1] > arr[z]:
res[-1] = arr[z]
pass
z+=1
return res
Last updated