class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
# dp = [1]*len(envelopes)
# if not envelopes:
# return 0
#超出时间限制
# envelopes = sorted(envelopes,key = lambda x:x[0])
# print(envelopes)
# res = 1
# #动态转移方程;以dp[i]结尾组成的最长严格递增子序列的长度
# for i in range(1,len(envelopes)):
# for j in range(i):
# if envelopes[i][0]>envelopes[j][0] and envelopes[i][1]>envelopes[j][1]:
# dp[i] = max(dp[i],dp[j]+1)
# res = max(res,dp[i])
# return res
if not envelopes:
return 0
N = len(envelopes)
#对第一个维度进行升序,第二个维度进行降序,只考虑第二维度即可
#因为按照第一个维度进行升序排序的时候,如果遇到第一维相同的值,那么第二维度可以进行降序,这样保证了后一个能套住前一个
envelopes.sort(key=lambda x: (x[0], -x[1]))
res = 0
dp = [1] * N
for i in range(N):
for j in range(i):
if envelopes[j][1] < envelopes[i][1]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
- 动态规划
- 第一维度和第二维度都升序
- 动态转移方程是dp[i]=max(dp[j]+1,dp[i])
- 第一维度和第二维度都进行比较
- 第一维度升序,第二维度降序