书架上的书


12

我有一些书和一个书架。我想尽可能多地在书架上放书,但是我有一个规则。书籍的所有尺寸(高度,宽度和深度)应在书架上形成不增加的顺序。

这就是说,每本书必须至少与书本上的书本一样高。宽度和深度也一样。您不能旋转书籍以交换它们的高度,宽度和深度。

您应该编写一个程序或函数,该程序或函数给出所有书籍的尺寸作为输入输出,或者返回我可以放在架子上的最大书籍数量。

输入值

  • 正整数的三元组列表,其中每个三元组定义一本书的高度,宽度和深度。
  • 输入列表中至少会有一个三元组。
  • 两本书可以沿任意多个维度具有相同的长度。

输出量

  • 一个正整数,表示服从该规则的书架上可容纳的最大书籍数量。

时间复杂度

您的算法应该在书本数量上具有最坏情况的时间复杂度多项式。这意味着,例如以下时间复杂度均有效:O(N ^ 3),O(log(N)* N ^ 2),O(N)和以下无效:O(2 ^ N), O(N!),O(N ^ N)。

例子

输入=>输出

(1, 1, 1) =>  1

(5, 2, 5), (1, 3, 5) =>  1

(5, 2, 5), (1, 2, 5) =>  2

(2, 2, 2), (2, 2, 2), (2, 2, 2), (1, 3, 6) =>  3

(1, 2, 5), (1, 3, 5), (1, 2, 8), (1, 2, 5), (7, 7, 7) =>  4

(5, 19, 3), (9, 4, 16), (15, 16, 13), (7, 4, 16), (1, 13, 14), (20, 1, 15), (9, 8, 19), (4, 11, 1) =>  3

(1, 1, 18), (1, 13, 7), (14, 1, 17), (8, 15, 16), (18, 8, 12), (8, 8, 15), (10, 1, 14), (18, 4, 6), (10, 4, 11), (17, 14, 17), (7, 10, 10), (19, 16, 17), (13, 19, 2), (16, 8, 13), (14, 6, 12), (18, 12, 3) =>  5

这是代码高尔夫球,因此最短的入场券获胜。

一个相关的有趣的书分类挑战:书库分类


您是说它应该按递减顺序排列吗?如果每本书的高度至少等于其后本书的高度,那就是您得到的,除非每本书的高度相同。
mbomb007'5

@ mbomb007是的,将“不减少”更改为“不增加”。
randomra'5

Answers:


4

Python 3:436字节

最初,我将其视为在周期有向图中找到最长的简单路径的NP完全问题。但是,图中的每个循环(实际上是完整的子图)都可以表示为单个顶点。换句话说,将相同的书籍视为一本书,将其作为一个整体放置在书架上。然后我们可以构造一个有向无环图,其中a-> b表示b在架子上可以跟随a。最后,我们使用递归方法找到输出树的最大高度。

import sys
b=[]
n={}
r=[]
for L in sys.stdin.readlines():z=[int(x)for x in L.split()];r+=[z];z in b or b+=[z]
def l(a,b):return a[0]<=b[0]and a[1]<=b[1]and a[2]<=b[2]
R=range(len(b))
for i in R: 
    n[i]=[]
    for j in R:i!=j and l(b[i],b[j])and n[i]+=[j]
def L(t):
    global v;best=0
    if t in v:
            return v[t]
    for s in n[t]:best=max(best,L(s)+1)
    v[t]=best+r.count(b[t])-1;return best
m=0
for i in R:v={};m=max(L(i)+1,m)
print(m)

1
这是一个不错的解决方案,但还没有真正打过高尔夫球。我会投票赞成的。
isaacg,2015年

3

Pyth,40个字节

KYleolNe.eaK+e+]])olNf.A.eg@YbZeT<Kk]YSQ

速度不快,但它是多项式。

相当于Python3:

def num_books(l):
    l = sorted(l)
    s = []
    for i, Y in enumerate(l):
        s.append(max([T for T in s[:i]
                      if all(Y[e] >= t for e, t in enumerate(T[-1]))] + [[]],
                     key=len) + [Y])
    return max(len(u) for u in s)

Python 3版本为177字节,具有明显的特点。只是个小气。
mbomb007

0

Python 2,231字节

在这里尝试

我的程序当前弄错了最后两个示例。有人可以帮我解决这个问题吗?谢谢。

我对3维的所有6个可能排列顺序的列表进行排序,然后查看列表中最长的连续排序关系,然后找出最大的连续排序关系。

另外,我知道是否可以打更多的高尔夫球,但是我不知道是否可以使用reduce它。简而言之,这种方式是在合理的时间内最容易做到的,而不会引起我的大脑爆炸。

from operator import*
from itertools import*
def f(t):
    m=1
    for l in(sorted(t,key=itemgetter(*o))for o in permutations(range(3))):
        c=1
        for k in range(len(l)-1):
            c+=all(i<=j for i,j in zip(l[k],l[k+1]))
        m=max(m,c)
    print m
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.