2016-05-26 1 views
1

この質問は「プログラミングのインタビューの要素」からのもので、数日間私を困惑させました。与えられたCのケースとDの許容されるフロアの最大床数

質問には、「CケースとD許容ドロップを考慮すると、最悪ケースでテストできるフロアの最大数はいくらですか?

仮定は以下の通りである:

1)全てのケースが同じ特性を有し、レベルからの1つ破損した場合、そうであろう他のすべて

2)落下を存続する場合は、再び使用されるが、破壊されてもよいです1つは破棄されます

3)落下時にケースが破損した場合、上の床から落下した場合にケースが破損します。それが生き残れば、それはより短い秋に生き残るだろう。

私には、この質問は、滴の数を最小限に抑えようとしている「一般化された2つの卵の問題」の変形のようです。 この問題は、決められた数のドロップがある場合、フロアの数を最大限にしようとします。

溶液で与えられる再帰関係は、以下である: - + 1 + F

F(C + 1、D)= F(1 C、D)(C + 1、D - 1)

ここで、F(c、d)= max#floorは、w/cケースとd dropsをテストできます。 この繰り返しの関係は、フロアF(c、d - 1)+ 1でテストしたときにケースが壊れない場合、右の項がフロアであるという本の説明にもかかわらず、私を混乱させています。ケースが壊れたときの原因は何ですか?これは反復関係には現れません。

質問には、O(c)スペースで同じ問題を解決する追加質問があります。上記の漸化関係を実装することは、当然、2Dメモマトリックスを用いた動的プログラミングにつながる。あなたは1Dアレイでこれをどうやって行いますか?

+0

(式中F(c, d - 1)対応)、それはF. – stark

答えて

1

1Dアレイでこれをどうしますか?

1.rewriteへの関数:F(C、D)= F(C - 1、D - 1)+ 1 + F(C、D - 1)

2.writeコードとしてこの:

for (i=1; i<=D; i++) 
for (j=C; j>=0; j--) 
    a[j] = a[j-1] + a[j] + 1 

説明:

a[j](after assignment, a[j] equals F(c, d)) 
    = a[j-1](F(c-1, d-1)) + a[j](F(c, d-1)) + 1 

マイconfusioケースが壊れたときの原因は何ですか?

フロアxでのテストケースを:

  1. 場合が生き残った場合、あなたは、(式中1 + F(c + 1, d - 1)対応)[X + 1、1]の場合は、床の上に壊れることはない知っています。
  2. ケースが壊れた場合、ケースは常に床[1、x]で壊れていることがわかります。あなたが1少ないケースを持って
+0

ため、以前に計算された値まで低下は、あなたの答えのためにどうもありがとうございます。あなたがスペースを最小限に抑えるために使ったテクニック - どのように思いつきましたか?そのような技術の総称はありますか? ' - (3、...となるx) - 基本的な考え方@JennaKwon –

+0

がある、のための' F(x、y)を計算し、 '、' Fとは何の関係もありません(×2、...) '、' Fは、 ...ので、私たちはスペースを再利用することができ、そして 'F保存しない(X - 2、...)'、 'F(X - 3、...)' ... – Sayakiss

+1

@JennaKwon Iドン」どのようにその技術が英語で正確に命名されたかを知ることができますが、中国語では、それを "动動集"と呼びます。少数のグーグルの後、私は英語で「スライディングウィンドウ」と呼ばれる同様の技術を見つけました。あなたは、詳細については[その](http://web.engr.illinois.edu/~jeffe/teaching/algorithms/notes/06-sparsedynprog.pdf)読むことができます。 – Sayakiss

関連する問題