【华为OD机试真题 python】叠积木

题目描述
给出一个列表如[[6,7,],[5,4],[3,2]],表示木块的长和宽,当木块的长和宽不大于另个木块的长和宽时,就可以放在上面,此外数组还可以左右翻转。求最多能搭多少层。
输入描述
一个二维数组,里面是每个积木的长和宽,可以左右翻转。
输出描述
最多能搭多少层。


样例
输入
[[5,4],[6,3],[6,7],[6,6],[4,6]]
输出
4


解题: 暂时忽略输入
排序,转化最大递减子序列问题

list1=[[5,4],[6,3],[6,7],[6,6],[4,6]]
list2 = [[] for _ in range(len(list1))]
for i in range(len(list1)):
    list2[i].append(max(list1[i]))
    list2[i].append(min(list1[i]))
# list2 --> [[5, 4], [6, 3], [7, 6], [6, 6], [6, 4]]
# 上一个循环已经将长放在第一位,宽放在第二位了
# 接下来根据第一位长的大小降序排列,在根据宽的大小降序排列
# 该问题将变成类似最大递减子序列问题
list2 = sorted(list2,key=lambda x:(-x[0],-x[1]))
# list2 --> [[7, 6], [6, 6], [6, 4], [6, 3], [5, 4]]
dp = [1]*(len(list2))  #左边没有比自己小的,则为1,仅一层
for i in range(1,len(list2)):
    for j in range(i):
        if list2[i][0] <= list2[j][0] and list2[i][1] <= list2[j][1] and dp[i] < dp[j] + 1:
            dp[i] = dp[j]+1      #dp[i]表示前i+1个积木最多可以叠多少层,如dp[2] = 2 ,表示前3个积木最多可以叠2层
# print(dp)
# print(list2)
print(max(dp))     #即要求的解

你可能感兴趣的:(python基础,python,算法,开发语言)