タグ付けされた質問 「dynamic-programming」

再帰的に得られた副問題の解を組み合わせることによって解決できる問題に関する質問。

3
ナップザックの問題—動的プログラミングソリューションにもかかわらずNP完全ですか?
ナップザックの問題は、動的プログラミングで簡単に解決できます。動的プログラミングは多項式時間で実行されます。それが我々がそうする理由ですよね? 私はそれが実際にNP完全な問題であると読んだことがありますが、それは多項式問題で問題を解くことはおそらく不可能であることを意味するでしょう。 私の間違いはどこですか?

3
動的計画法の副問題の決定
私はダイナミックプログラミングの手法を複数回使用しましたが、今日、友人から副問題をどのように定義するかを尋ねられ、客観的な正式な回答を提供する方法がないことに気付きました。動的計画法を使用して解決する問題のサブ問題を正式に定義するにはどうすればよいですか?

2
トップダウンとボトムアップの動的プログラミングに違いはありますか?
トップダウンとボトムアップの動的プログラミングには根本的な違いがありますか? 特に、ボトムアップでは解決できるがトップダウンでは解決できない問題がありますか?または、ボトムアップアプローチは、トップダウンアプローチの繰り返しを単に解くだけですか?

4
動的プログラミングとは何ですか?
この質問が愚かに聞こえる場合は、事前に申し訳ありません... 私の知る限り、動的プログラミングを使用したアルゴリズムの構築は次のように機能します。 問題を再帰関係として表現します。 メモ化またはボトムアップアプローチのいずれかを使用して、再帰関係を実装します。 私の知る限り、動的プログラミングに関するすべてを述べてきました。つまり、動的プログラミングでは、再帰関係を表現したり、コードに変換したりするためのツール/ルール/メソッド/定理は提供されません。 それでは、動的プログラミングの特別な点は何ですか?ある種の問題に取り組むための漠然とした方法以外に、それはあなたに何を与えますか?

5
動的プログラミングの事例の区別:例が必要です!
私はしばらくの間、動的プログラミングに取り組んできました。動的プログラミングの再帰を評価する標準的な方法は、必要なすべての値のテーブルを作成し、行ごとに入力することです。たとえば、Cormen、Leiserson et al: "Introduction to Algorithms"を参照してください。 2次元のテーブルベースの計算スキーム(行ごとの塗りつぶし)に焦点を当て、セルの依存関係の構造、つまり、別のセルを計算する前にどのセルを実行する必要があるかを調べます。セルiが依存するセルのインデックスのセットを示します。Γはサイクルフリーである必要があることに注意してください。Γ(i)Γ(i)\Gamma(\mathbf{i})ii\mathbf{i}ΓΓ\Gamma 計算された実際の関数から抽象化し、その再帰構造に集中します。正式には、次の形式の場合、繰り返しは動的プログラミングであると考えます。ddd d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) 、〜Γ D(I)= { (J、D (J))| J ∈ Γ D(I)}とFしないいくつかの(計算)関数使用D経由以外の〜Γの dは。i∈[0…m]×[0…n]i∈[0…m]×[0…n]\mathbf{i} \in [0\dots m] \times [0\dots n]Γ˜d(i)={(j,d(j))∣j∈Γd(i)}Γ~d(i)={(j,d(j))∣j∈Γd(i)}\widetilde{\Gamma}_d(\mathbf{i}) = \{(\mathbf{j},d(\mathbf{j})) \mid \mathbf{j} \in \Gamma_d(\mathbf{i}) \}fffdddΓ˜dΓ~d\widetilde{\Gamma}_d 粒度制限すると(現在のセルの左、左上、上、右上、...に)粗い部分に1が有効の3例(アップ対称性及び回転)は、本質的に存在していることを観察しますテーブルへの入力方法を通知する動的プログラミングの再帰:ΓdΓd\Gamma_d 赤い領域は(過剰近似)を示します。ケース1と2はサブセットを認め、ケース3は最悪の場合です(インデックス変換まで)。赤い領域全体がΓで覆われている必要はないことに注意してください。テーブルのすべての赤い部分の一部のセルは、それを赤く塗るのに十分です。白い領域には、必要なセルが含まれないようにする必要があります。ΓΓ\GammaΓΓ\Gamma ケース1の例は、編集距離と最長共通サブシーケンスであり、ケース2はBellman&FordおよびCYKに適用されます。あまり明らかではない例には、提案されたケースに合うように回転できるため、行(または列)ではなく対角線で機能するものが含まれます。例については、ジョーの回答を参照してください。 ただし、ケース3の(自然な)例はありません!だから私の質問は:ケース3の動的プログラミングの再帰/問題の例は何ですか?

6
動的プログラミングとブルートフォースの違い
次の引用に出会ったとき、私はダイナミックプログラミングを読んでいました 動的プログラミングアルゴリズムは、問題を解決するために考えられるすべての方法を調べ、最適なソリューションを選択します。したがって、ダイナミックプログラミングは、インテリジェントなブルートフォースの方法であるとおおまかに考えることができます。これにより、考えられるすべてのソリューションを選択して、最良のソリューションを選択できます。問題の範囲がすべての可能なソリューションを通過することが可能であり、十分に高速である場合、動的プログラミングは最適なソリューションを見つけることを保証します 次の例を示しました たとえば、ラッシュアワー中に特定の都市で、できるだけ早くポイントAからポイントBに移動しなければならないとしましょう。ダイナミックプログラミングアルゴリズムは、トラフィックレポート全体を調べて、考えられるすべての道路の組み合わせを調べて、どちらの方法が最も速いかを示します。もちろん、アルゴリズムが終了するまでしばらく待たなければならない場合があり、そうして初めて運転を開始できます。あなたが進む道は最速のものになります(外部環境で何も変わらないと仮定すると) ブルートフォースは、最善の解決策を決定する前に、考えられるあらゆる解決策を試みています。 それがまたあればどのように動的ブルートフォースは異なるプログラミングされて最適なものを選ぶ前に、すべての可能な解決策を通過し、私が見る唯一の違いは、動的プログラミングは、アカウントに追加の要因(この場合は交通状況を)取ることです。 動的計画法はブルートフォース法のサブセットであると言ってもいいですか?

3
nで割り切れる最大の合計
StackOverflowでこの質問をしましたが、ここがより適切な場所だと思います。 これは、アルゴリズムコースの概要からの問題です。 n個の正の整数を持つ配列があります(配列を並べ替えたり、要素を一意にする必要はありません)。示唆O (N )で割り切れる要素の最大和見つけるためのアルゴリズムをnと。aaannnO(n)O(n)O(n)nnn 例: = [ 6 、1 、13 、4 、9 、8 、25 ] 、N = 7。答えは56(要素と6 、13 、4 、8 、25)a=[6,1,13,4,9,8,25],n=7a=[6,1,13,4,9,8,25],n=7a = [6, 1, 13, 4, 9, 8, 25], n = 75656566,13,4,8,256,13,4,8,256, 13, 4, 8, 25 それはそれを見つけることは比較的簡単です動的プログラミングを使用して、残りで最大の和を格納0 、1 、2 、。。。、n − 1。O(n2)O(n2)O(n^2)0,1,2,...,n−10,1,2,...,n−10, 1, 2,..., n - 1 また、我々は要素の連続配列に注意を制限した場合、それはに最適なシーケンスを見つけるのは簡単だ時間、部分和を格納することによって、モジュロN:聞かせてS …

3
文字列の切断に関する動的プログラミング演習
私はこの本から次の問題に取り組んできました。 特定の文字列処理言語は、文字列を2つの部分に分割する基本的な操作を提供します。この操作には元の文字列のコピーが含まれるため、カットの位置に関係なく、長さnの文字列に対してn単位の時間がかかります。今、文字列を多くの部分に分割したいとします。休憩が行われる順序は、合計実行時間に影響を与える可能性があります。あなたがた位置に20文字の文字列をカットしたい場合たとえば、と、その後の位置に最初のカットを作り、負うの総コスト位置10をしている間、最初のより良いコスト持ち。3333 20 + 17 = 37 20 + 10 = 3010101033320 + 17 = 3720+17=3720 + 17 = 3720 + 10 = 3020+10=3020 + 10 = 30 カットが与えられ、ストリングを個にカットする最小コストを見つける動的プログラミングアルゴリズムが必要です。m + 1mmmm + 1m+1m +1

3
配列なしのメモ化
Cormen et al。の「アルゴリズムの概要」のセクション15.3 動的プログラミングの要素では、メモ化について次のように説明しています。 メモ化された再帰アルゴリズムは、各サブ問題の解決策のエントリをテーブルに保持します。各テーブルエントリには、エントリがまだ入力されていないことを示す特別な値が最初に含まれています。再帰アルゴリズムが展開するときにサブ問題に最初に遭遇すると、その解が計算されてテーブルに保存されます。このサブ問題に遭遇するたびに、テーブルに保存されている値を検索して返します。 さらに、脚注として追加します。 このアプローチでは、考えられるすべてのサブ問題パラメーターのセットがわかっていること、およびテーブルの位置とサブ問題の間の関係が確立されていることを前提としています。別のより一般的なアプローチは、サブ問題パラメーターをキーとしてハッシュを使用してメモすることです。 メモした値を(多次元)配列ではなく辞書に保存する必要がある(または簡単にする)よく知られているDPの問題はありますか? 背景:これが何らかの用途であれば、この質問の理由は、動的プログラミングを見たばかりの人に(自己均衡型)バイナリ検索ツリーの概念を動機付けようとしているからです。

2
動的プログラミングを使用して再帰アルゴリズムの時間の複雑さを軽減できるのはいつですか?
動的プログラミングは、再帰アルゴリズムの実行に必要な時間を短縮できます。動的プログラミングは、アルゴリズムの時間の複雑さを軽減するのに役立つことを知っています。再帰的アルゴリズムで満たされた場合、動的計画法を使用するとアルゴリズムの時間の複雑さが軽減されるという一般的な条件はありますか?動的プログラミングはいつ使用する必要がありますか?

2
行列連鎖の乗算とべき乗
それぞれ1000 × 2と2 × 1000の次元の2つの行列とBがあり、(A B )5000を計算する場合、最初に式をA (B A )4999 Bとして書き換えてから、A Bは1000 × 1000の次元ですが、B Aは2 × 2の次元であるため、数値的に評価します。AAABBB1000×21000×21000\times22×10002×10002\times1000(AB)5000(AB)5000(AB)^{5000}A(BA)4999BA(BA)4999BA(BA)^{4999}BABABAB1000×10001000×10001000\times1000BABABA2×22×22\times2 この問題の一般化されたバージョンを解決したいと思います。以下を含む式を最適化するための合理的な効率的なアルゴリズム(ブルートフォースではない)はありますか? 既知の次元の自由行列変数 任意の部分式の積 自然な力に引き上げられた任意の部分式 ...フリーマトリックス変数を具体的なマトリックス値で置き換えた後、数値的に評価するのに必要な作業が最小になるようにするには? 行列チェーン乗算問題は私の問題の特殊なケースです。 編集: これは暫定的な答えです。直感的には正しいようですが、それが正しいことを証明するものはありません。それが正しいことが判明した場合でも、証明に興味があります。(もちろん、正しくない場合は修正してください。) などのべき乗されたすべての積について、因子のすべての巡回置換を検討します。(A1A2…Ak)n(A1A2…Ak)n(A_1 A_2 \ldots A_k)^n (A1A2…Ak)n(A1A2…Ak)n(A_1 A_2 \ldots A_k)^n A1(A2…AkA1)n−1A2…AkA1(A2…AkA1)n−1A2…AkA_1 (A_2 \ldots A_k A_1)^{n-1} A_2 \ldots A_k A1A2(A3…AkA1A2)n−1A3…AkA1A2(A3…AkA1A2)n−1A3…AkA_1 A_2 (A_3 \ldots A_k A_1 A_2)^{n-1} A_3 \ldots …

2
時間での単語分解
2つの文字列与えられた場合、それらの連結のためにを記述します。文字列を考えるとと整数、我々は書くの連結のためののコピー。文字列が与えられると、この表記を使用して「圧縮」できます。つまり、はとして記述できます。レッツ・コールの体重圧縮そこに登場するキャラクタの数、重量のように、 2である、との重量(圧縮の)3であります(分けるS1,S2S1,S2S_1, S_2S1S2S1S2S_1S_2SSSk≥1k≥1k\geq 1(S)k=SS⋯S(S)k=SS⋯S(S)^k = SS\cdots SkkkSSSAABAABAABAABAABAAB((A)2B)2((A)2B)2((A)^2 B)^2((A)2B2)((A)2B2)((A)^2 B^2)(AB)2A(AB)2A(AB)^2 AABABAABABAABABAAAA単数または複数)は別々にカウントされます。 今、与えられた文字列の「最軽量」圧縮計算する問題を検討と。少し考えた後、正確なアプローチに応じてまたはで実行される明らかな動的プログラミングアプローチがあり。SSS|S|=n|S|=n|S|=nO(n3logn)O(n3log⁡n)O(n^3 \log n)O(n3)O(n3)O(n^3) ただし、この問題は時間で解決できると言われていますが、これを行う方法に関する情報源は見つかりません。具体的には、この問題は最近のプログラミングコンテスト(問題K ここ、最後の2ページ)で与えられました。分析中にアルゴリズムが提示され、最後に疑似2次境界が示されました(ここでは4分マーク)。悲しいことに、プレゼンターは「複雑な単語の組み合わせ補題」に言及しただけだったので、解決策を求めるためにここに来ました:-)O(n2logn)O(n2log⁡n)O(n^2 \log n)O(n3logn)O(n3log⁡n)O(n^3 \log n)

1
ナップザック問題の変種
定数によってナップザックの項目数を制限する必要がある場合、動的プログラミングの状況でナップザック問題にどのようにアプローチしpppますか?これは同じ問題(最大重みWWW、すべてのアイテムに値vvvと重みwww)ですが、ナップザックに追加できるのはpppアイテムのみで、明らかにナップザックの値を最適化する必要があります。 3次元が必要ですか、それ以外のアプローチを見つけることができますか。セルのナップザックに項目の数を単純に追加しようとし、項目の数<= で最後に最大値を取得しようとしましたpppが、これは最善の解決策ではありません。

2
多数の副問題を伴う動的プログラミング
多数の副問題がある動的プログラミング。だから私はインタビューストリートからこの問題を解決しようとしています: グリッド・ウォーキング(50点のスコア) あなたはに位置しているの位置に次元グリッド。グリッドの次元は)です。1つのステップで、次元のいずれかを1つ前または後ろに歩くことができます。(したがって、常に可能な異なる動きがあります)。どの時点でもグリッドを離れないように、ステップをいくつ実行できますか?あなたは、任意のためならば、グリッドを離れる、どちらかまたは。(X 1は、xは2、... 、xはN)(D 1、D 2、... 、D N N 2 N M X I 、X I ≤ 0 X I > DのIをNNN(x1,x2,…,xN)(x1,x2,…,xN)(x_1,x_2,\dots,x_N)(D1,D2,…,DN(D1,D2,…,DN(D_1,D_2,\dots,D_NNNN2N2N2NMMMxixix_ixi≤0xi≤0x_i \leq 0xi>Dixi>Dix_i > D_i 私の最初の試みは、このメモ化された再帰的な解決策でした: def number_of_ways(steps, starting_point): global n, dimensions, mem #print steps, starting_point if (steps, tuple(starting_point)) in mem: return mem[(steps, tuple(starting_point))] val = 0 if …

1
編集距離計算のためのマイクロ最適化:それは有効ですか?
上ウィキペディア、編集距離のためのボトムアップの動的プログラミングスキームの実装が与えられています。それは完全に定義に従っていません。内部セルはこうして計算されます: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } ご覧のとおり、一致がある場合、アルゴリズムは常に左上隣から値を選択し、一部のメモリアクセス、ALU操作、および比較を保存します。 ただし、削除(または挿入)の結果、値が小さくなる可能性があるため、アルゴリズムはローカルで正しくありません。つまり、最適性の基準に違反しています。しかし、おそらく間違いは最終結果を変えない-それはキャンセルされるかもしれない。 このマイクロ最適化は有効ですか、そしてなぜ(そうではない)のでしょうか?

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