선반에 책


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

이것은 코드 골프이므로 가장 짧은 참가작이 승리합니다.

관련된 흥미로운 책 정렬 도전 : Book Stack Sort .


그것이 감소하는 순서를 형성 해야 한다는 것을 의미 합니까? 모든 책의 높이가 같지 않은 한, 각 책이 그 이후의 책만큼 높으면 얻을 수있는 것입니다.
mbomb007

@ mbomb007 맞습니다. "비 감소"를 "비 증가"로 변경했습니다.
randomra

답변:


4

파이썬 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
이것은 좋은 해결책이지만 아직 골프는 아닙니다. 나는 일단 upvote거야.
isaacg

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 바이트입니다. 그냥 fyi.
mbomb007

0

파이썬 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.