题解 | #信封嵌套#

信封嵌套

http://www.nowcoder.com/practice/25fe1fc89c4c4e82bbc63df04bc6ca30

补一个python3答案:

方法:

  1. 按宽递增排序后,求长的最长严格上升子序列,同时要求宽不相等

注意:为保证宽不相等,可以使等宽区域内按长逆序排列,这样严格上升子序列在每组宽中只能取一个长,例:

输入排序前:
[[3, 4], [2, 3], [4, 5], [1, 3], [2, 2], [3, 6], [1, 2], [3, 2], [2, 4]]
排序后:
[[1, 3], [1, 2],
 [2, 4], [2, 3], [2, 2], 
 [3, 6], [3, 4], [3, 2], 
 [4, 5]
 ]

python3代码:

# 按宽递增排序后,求长的最长严格上升子序列,同时宽不相等(等宽区域内按长逆序排列即可)

def maxIncSub(arr,col=1):
    # @arr 传入数组
    # @col 按第col列求
    # @return 返回最长严格上升子序列的长度
    n=len(arr)
    dp=[1]*n
    for i in range(1,n):
        for j in range(i):
            if arr[j][col]<arr[i][col]:
                dp[i]=max(dp[i],dp[j]+1)
    return max(dp)


n=eval(input())
letters=[]
for _ in range(n):
    letters.append(list(map(int,input().split())))

# 先按长逆序,后按宽正序,即可使等宽区域内按长逆序排列
letters.sort(key=lambda x:x[1],reverse=True) # O(nlogn)
letters.sort(key=lambda x:x[0]) # 按宽排序 O(nlogn)

print(maxIncSub(letters,1))

全部评论

相关推荐

点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务