较为拙劣的处理用例输入
由于本人算是半路出家,如果有更好的解决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()注释掉既可