华为机考 叠积木 python (以及处理输入)

较为拙劣的处理用例输入

由于本人算是半路出家,如果有更好的解决python的输入问题,还请不吝赐教

关于这个叠积木问题,我看到有这样的版本(转自添加链接描述
在这里插入图片描述输入的是包含长和宽的二维数组

还有这样的
在这里插入图片描述如果只是输入一项比较,未免也太简单了,和那个最长上升子序列问题很接近了

以第一个例子来说吧,需要比较长和宽
如果不考虑输入,算法是这样的

list1 = [[2,3],[6,3],[3,5],[5,4],[6,5]]
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 = sorted(list2,key=lambda x:(-x[0],-x[1]))
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))     #即要求的解

这里关键的是排序,把长、宽顺序排完后(先长后宽),又变成类LIS问题了
如何传入测试用例,如

[[2,3],[6,3],[3,5],[5,4],[6,5]]

如果是核心代码模式的话,这个二维数组是不用你处理的,即把第一行去掉改改就好了
但很多机考要求是ACM模式,如何input()测试用例让我很是头疼,于是我选择了比较繁琐的方式

list1 = input()
list1 = list1.replace("[","")
list1 = list1.replace(']','')
list1 = list1.replace(',', ' ')
t = list(map(int,list1.split()))
print(list1)
print(t)

传入为字符串,再将二维数组里的元素转为整型(后续排序需要),不打乱持续(即长,宽,长,宽,长,宽…),print看一下转换后的结果
在这里插入图片描述再遍历t,将t中元素两项两项的存入新数组
创建二维数组temp

temp = [[] for _ in range((len(t)//2))]
count = 0
for i in range(0,len(t)-1,2):   #注意-1,只需要遍历到倒数第二项
    temp[count].append(t[i])
    temp[count].append(t[i+1])
    count += 1
print(temp)

输出为
在这里插入图片描述接下来就可以根据temp来进行求解了

list1 = input()
list1 = list1.replace("[","")
list1 = list1.replace(']','')
list1 = list1.replace(',', ' ')
t = list(map(int,list1.split()))
print(list1)
print(t)

temp = [[] for _ in range((len(t)//2))]
count = 0
for i in range(0,len(t)-1,2):
    temp[count].append(t[i])
    temp[count].append(t[i+1])
    count += 1
print(temp)

list2 = [[] for _ in range(len(temp))]
for i in range(len(temp)):
    list2[i].append(max(temp[i]))
    list2[i].append(min(temp[i]))
#上一个循环已经将长放在第一位,宽放在第二位了
#接下来根据第一位长的大小降序排列,在根据宽的大小降序排列
#该问题将变成类似最大递减子序列问题
list2 = sorted(list2,key=lambda x:(-x[0],-x[1]))
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))   #即所求解

将多余print()注释掉既可

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值