n個のサイコロを与えられた場合、それぞれのa面と合計bは、合計bが得られるウェイ数を返します。どのようにして時間の複雑さと空間の複雑さを減らすことができますか? これはGoogleのインタビューで尋ねられました。私は答えが不明です。Googleインタビューパズル
答えて
(比A> = B-Nする)十分な大きさであると仮定すると、これは 'N' 子供の中 'のB' キャンディーを配布する一般的な問題である
x1+x2+x3+...+xn=b
まで沸騰。あなたは0が直面しないようにしたい場合は K-、とても
(y1+1)+(y2+1)...+(yn+1)=b
y1+y2+...+yn=b-n
Z1 + Z2 + ... ZK =の一般解nが C(N + K-1であることを確認するために簡単なはず死にますいくつかのdownvotesをreciving後1)
EDIT:
たちは
DPの問題としてそれを定式化することができ、我々は '' すなわちBN> A、 上の制限を持っていると仮定すると、その後、我々は次のような関係
from k = 2 to n
from j = 1 to b
from x = 1 to a
dp[k][j] += dp[k-1][j-x] where x is from 1 to a at max and x<j
と答えを評価することができます[n]はDPである必要があり、[B] ストレージであれば次数n * b、およびランタイムOの(N * B * A)
なぜインタビュアーは時間と空間の複雑さを求めましたか? –
あなたのソリューションではダイスの価値が最大であることを考慮していないため、これは正しくありません。 –
それはx1 + x2 + ... + xn = bでなければなりません。n個のダイがあり、それぞれのダイがその最大値まで増やすことができます。あなたは便宜上、「die」のそれぞれが最大である「a」を無視することができます。これは(b-1はn-1を選択します) –
これはn
の正の整数の合計としてb
を書き込む方法の数を見つけるよう求めています。答えはcompositionsのb
にn
の部分の番号です。これは(b-1 choose n-1)
です。
ここで、部品のサイズがa
に制限されているという制約を考慮すると、問題はもう少し面白くなります。これにはgenerating functionsを使用することをおすすめします。答えは製品(x+x^2+...+x^a)^n
の係数x^b
になります。どうして?各ダイ(ダイスの単数形)については、1
とa
の間の数値があり、これは指数がx
で表されています。 n
の各単語から1つずつx^i
を取得すると、これは数字のi
と同じです。指数の合計は、あなたの後の合計、つまりb
でなければなりません。
は、私たちも述べmultinomial theoremを使用して問題を少し簡略化することができます。すべてのki >= 0
(x + x^2 + ... + x^a)^n = sum_{k1+k2+...+ka=n} (n multichoose k1,k2,...,ka) x^{k1+2*k2+...+a*ka}
を。だから、答えはいくつかの方法が
sum_{k1+k2+...+ka=n & k1+2*k2+...+a*ka=b} (n multichoose k1,k2,...,ka)
であるということである私は、それぞれの値の可能な組み合わせの数をカウント配列hits[max + 1]
を持っているでしょう。 max
はn * a
であり、もちろんhits[0]
~hits[n - 1]
は空のままです。
愚かなやり方は、ループのためにn
(各ダイに1つ)を実行し、ダイスの現在の合計についてhits
にヒットを登録することです。
以下ダム方法は、私は各順序付けシャッフルするための組み合わせの数を書き出す組合せ論のビットを使用することである。
1111 1つの組合せがある(合計= 4)
あります1112の4組み合わせ(和= 5)
1113 4組み合わせ(合計= 6)
...
1123 4 * 3月2日の組み合わせ(和= 7)
がある...
があります 4 * 3 * 2 comがあります1234年のbinations(合計= 10)
...
あなたはダムソリューションよりも、forループにあまり時間を費やす必要がaaaa
(合計= n * a
)
の1つの組み合わせがあります。
ダムメソッドでヒットするのではなく、繰り返しごとに多くのヒットが得られます。
これらのforループは、(1,2,3,4、...、a
)を超える(n - 1)パーティションの区切りを移動するだけです。 区切りは同じ場所にすることができます(例:ケース1111の場合はすべて1と2の間です)。ただし、1未満またはそれ以下の間隔を持たないようにしてください。a
- 1. Googleスタンドアロンgoogleアプリスクリプトgoogleシート
- 2. GoogleフォトアプリGoogleフォトアプリで
- 3. Google Picker for Google sites
- 4. Googleドキュメントのgoogleシートスクリプト
- 5. GoogleアプリケーションエンジンのGoogleクラウドエンドポイント
- 6. Google datetimeとのGoogleライングラフ
- 7. モバイルトラッキングGoogleアナリティクスとGoogleタグマネージャ
- 8. Google App EngineとGoogleストレージ
- 9. GoogleスプレッドシートにGoogleスプレッドシートJava API
- 10. フラグメント内のGoogleのgoogle maps
- 11. Google APIのキーGoogleクライアントID
- 12. GoogleタグマネージャとGoogleエンハンストEコマーストラッキング
- 13. Androidスタジオ、Google Firebase、Googleマップ
- 14. google maps APIのGoogleアナリティクス
- 15. google api infoWindow google maps api
- 16. Google Cloud Endpoints with Google Cloud Functions
- 17. Android Google Map:android google mapのエラー
- 18. Google CSE、Google Scholarの検索
- 19. Google Cloud DatastoreとGoogle App Engine
- 20. Google App EngineとGoogleカレンダーAPI
- 21. FirebaseとGoogle Analyticsのgoogle-services.json
- 22. GoogleスプレッドシートのないGoogle Chart
- 23. java + google web toolkit(google appsエンジン)
- 24. Google Maps APIとGoogle Maps Engine?
- 25. Googleのアプリスクリプト、チームドライブのGoogleピッカー
- 26. GoogleプロジェクトをGoogleコンピューティングエンジンにデプロイ
- 27. Google AnalyticsとGoogleタグマネージャのクッキー
- 28. Googleコンテナレジストリ+ Google Compute Engine + Docker
- 29. Google C++ Mocking Framework(Google Mock)(V1.5)
- 30. Google Developers ConsoleとGoogle Play Console
あなたはGoogleに回答を許可されていますか? –
"nサイコロ、それぞれの '面'は、各ダイが1〜* a *の値を持つことを意味しますか?それとも、各ダイに* a *値があることを意味するだけで、2D配列などから* n * x * a *値の合計を調べなければなりませんか? – ruakh
Hmm、問題をどのように分割しようとしても、私はO(n)以下では空間の複雑さを得ることができません。 –