数字のセットから最も高いタワー


20

編集:質問の最後のバウンティパズル。

1桁の数字のセットが与えられたら、それらが構築できるタワーの高さを決定する必要があります。

数字は、立つことができる地面レベルの水平面に住んでいます。複数桁の数字と混同したい数字はありません。そのため、常に両側に空のスペースがあります。

4 2  1 9  6  8

数字を別の数字の上に置くことができます。

2
6

または、対角線下にある他の2つでサポートできます。

 9
5 8

下部は、上部がサポートする重量(ある場合)と、上部の重量(常に1)をサポートする必要があります。サポーターが2人いる場合、サポーターは上部のサポーターの総重量を均等に分割します(50%-50%)。

すべての数字の重みは、その値に関係なく1です。

1桁で他の2桁をサポートする場合、対応する重みの合計をサポートできる必要があります。数字は最大でその数値をサポートできます。

いくつかの有効な塔(高さ43および5):

            0          
7           1
5    1     1 1         9 supports a total weight of 1.5 = (1+1/2)/2 + (1+1/2)/2
2   5 4    5 5        
3  5 9 5  5 6 3        6 supports a total weight of 3 =  1.5 + 1.5 = (2*1+(2*1/2))/2 + (2*1+(2*1/2))/2

いくつかの無効な塔:

1         5           The problems with the towers are (from left to right):
1  12    2 3     8      1 can't support 1+1; no space between 1 and 2;
1  5 6  1 1 1   9       1 can't support 1.5 = (1+1/2)/2 + (1+1/2)/2; 8 isn't properly supported (digits at both bottom diagonals or exactly below the 8)    

入力または出力として桁のリストを指定するか、それらの桁の一部(すべて)を使用して構築可能な最高塔の高さを返すプログラムまたは関数を作成する必要があります。

入力

  • 少なくとも1つの要素を持つ非負の1桁の数字のリスト。

出力

  • 単一の正の整数、構築可能な最高塔の高さ。
  • あなたの解決策は、私のコンピューターで1分以内にすべてのサンプルテストケースを解決する必要があります(近くのケースのみをテストします。平均以下のPCを持っています)。

フォーマットではInput list => Output number、出力の一部ではない次の行にタワーがあります。

[0]  =>  1

0

[0, 1, 1, 1, 1, 1]  =>  3

  0
  1
 1 1

[1, 1, 1, 1, 1, 2, 2]  =>  4

   1
   1
  1 1
 1 2 2

[0, 0, 2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9

0
2
2
5
5
5
7
7
9

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  9

   1
   2
   2
   3
   4
   5
  3 3
 4 4 4
5 5 5 5

[0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  11

   0
   1
   2
   3
   4
   5
  3 3
  4 5
  5 5
 3 7 3
2 7 9 2

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  12

 0
 1
 2
 3
 4
 5
 6
 7
4 5
6 7
8 8
9 9

[0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9]  =>  18

      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
     5 5
     6 6
     7 7
    4 8 4
   3 7 7 3
  2 6 8 6 2
 2 5 8 8 5 2
 3 9 9 9 9 3

これはコードゴルフであるため、最短のエントリが優先されます。

バウンティ

私は意志賞100評判の恵み(入力リストの長さに関して)多項式時間で下に拡張された問題を解決するか、それが不可能であることを証明するための(既に授与されたものと無関係)(Pを仮定!= NP)。拡張問題の詳細:

  • 入力番号は、数字だけでなく、負でない整数でもかまいません
  • 複数桁の数字は、1桁の数字と同じ場所を占めます
  • 複数桁の数字は数値24をサポートできます。たとえば、サポートできます24

バウンティオファーには有効期限はありません。証拠が表示された場合、賞金を追加して報酬を与えます。


1
新しいPCを購入するのに十分なお金がありますか?その後、私は解決策を持っています:P
ThreeFx

1
あなたの3-2-5-7塔は私を混乱させます。あなたは「一番下のものは、上のものが(もしあれば)が支える重量に加えて、常に1である上のものの重量を支えなければならない」と言います。 「その数値」-各桁の重みが1である場合、異なる数値を持つポイントは何ですか?
MIライト

3
@MIWright数値は、その数値の上に積み重ねることができる重量を示します。しかし、数自体の重量は常に1です
マーティン・エンダー

@MartinBüttnerオハイオ州、当たり前。ありがとうございました。
MIライト

タイトルには数字のセットが記載されていますが、例を考慮すると、リストを意味するように見えます。セットに重複を含めることはできません。
グリムミー

回答:


10

Python 2-326

与えられたすべての例の制限時間内で簡単に実行できますが、サイズの効率をいくらか犠牲にしました。考えてみると、1桁の数字しか許可されていないため、可能な最大の塔はそれほど大きくないかもしれません。

def S(u,c=0,w=[]):
 for(s,e)in[(len(w),lambda w,i:w[i]),(len(w)+1,lambda w,i:.5*sum(([0]+w+[0])[i:i+2]))]:
    m=u[:];l=[-1]*s
    for n in u:
     for i in range(s):
        if 0>l[i]and n>=e(w,i):m.remove(n);l[i]=n;break
    if([]==l or-1in l)==0:
     for r in S(m,c+1,[1+e(w,i)for i in range(s)]):yield r
 yield c
print max(S(sorted(input())))

2
最大の高さのようなルックスは18です
カイルGullion
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.