1、最长递增子序列
def LIS(nums):
res = 0
length = len(nums)
if length<2: return length
dp = [1 for _ in range(length)]
for i in range(length):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
res = max(res, dp[i])
return res
def LIS2(nums):
length = len(nums)
if length<2: return length
up = [nums[0]]
for num in nums[1:]:
if up[-1] < num:
up.append(num)
continue
l, r = 0, len(up)-1
while l<r:
mid = l+((r-l)>>1)
if up[mid]<num:
l = mid+1
else:
r=mid
up[l] = num
return len(up)
2、最大子数组和
def maxSeqSum(nums):
if not nums:
return -1
length = len(nums)
max_sum = nums[0]
dp = nums.copy()
for i in range(1, length):
dp[i] = max(dp[i-1]+nums[i], nums[i])
max_sum = max(dp[i], max_sum)
cur_sum = nums[0]
for i in range(1, length):
cur_sum = nums[i] if cur_sum<0 else cur_sum+nums[i]
max_sum = max(cur_sum, max_sum)
return max_sum
3、最大子序列乘积
def maxProduct(nums):
length = len(nums)
res = nums[0]
dp_max = dp_min = nums.copy()
for i in range(1, length):
dp_max = max(dp_max[i-1]*nums[i], nums[i], dp_min[i-1]*nums[i])
dp_min = min(dp_max[i-1]*nums[i], nums[i], dp_min[i-1]*nums[i])
res = max(res, dp_max[i])
max_dp = min_dp = 1
for i in range(length):
temp_min = min_dp
temp_max = max_dp
min_dp = min(nums[i], temp_max*nums[i], temp_min*nums[i])
max_dp = max(nums[i], temp_max*nums[i], temp_min*nums[i])
res = max(max_dp, res)
return res