最长递增子序列
1. 问题描述
给你一个整数数组nums
,找到其中最长严格递增子序列的长度
2. 问题解决
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return dp
import bisect
dp = [1] * len(nums)
d = [nums[0]]
for i in range(1, len(nums)):
if nums[i] > d[-1]:
d.append(nums[i])
dp[i] = len(d)
else:
pos = bisect.bisect_left(d, nums[i])
d[pos] = nums[i]
dp[i] = pos + 1
return dp
3. 案例——合唱队
import bisect
def lls(s):
dp = [1] * len(s)
arr = [s[0]]
for i in range(1, len(s)):
if s[i] > arr[-1]:
arr.append(s[i])
dp[i] = len(arr)
else:
pos = bisect.bisect_left(arr, s[i])
arr[pos] = s[i]
dp[i] = pos + 1
return dp
if __name__=='__main__':
while True:
try:
n = int(input())
s = list(map(int, input().split()))
left_dp = lls(s)
right_dp = lls(s[::-1])[::-1]
sum_dp = [left_dp[i] + right_dp[i] - 1 for i in range(n)]
print(str(n-max(sum_dp)))
except:
break