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

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

1
これはNP完全問題ですか?
次の問題ステートメントを検討してください。 最初の数が与えられると、あなたとあなたの友人は交代でそれから完全な四角形を引きます。ゼロに勝つ最初のものは勝利します。例えば: 初期状態:37 Player1は16を減算します。状態:21 Player2は8を減算します。状態:13 Player1は4を減算します。状態:9 Player2は9を減算します。状態:0 Player2が勝利! 初期状態が与えられ、最適な動き、つまりゲームの勝利につながることが保証されている動きを返すプログラムを記述します。可能な動きがあなたを勝利状態に導くことができないなら、-1を返します。 この問題は、動的プログラミングを使用して疑似多項式時間で解決できます。アイデアは、長さn(nは初期状態)の配列を下から上に最適な移動で埋めるか、または移動が勝てない場合は-1です。これは、O(n * sqrt(n))を必要とします。これは、すべての数値について、それよりも小さい可能性のあるそれぞれの完全な二乗を減算することを考慮する必要があるためです(それらの〜sqrt(n)があります)。ただし、これは疑似多項式のランタイムの複雑さです。これは、ランタイムがバイナリの入力サイズ(数値を表すために使用されるビット数)に関連して実際に指数関数的にスケーリングされるためです。 誰でもこの問題を解決するための多項式アルゴリズムを考えることができますか?そうでない場合、それはNP-Completeでしょうか?どうして?

1
最長の繰り返しサブシーケンスを見つける
文字列与えられた場合、最も長い繰り返し(少なくとも2回)のサブシーケンスを見つけたいと思います。つまり、私は、文字列検索したいwののサブシーケンスである(連続している必要はありません)のように、W = ワット" ⋅ ワットを"。つまり、wは半分が連続して2回現れる文字列です。wはsのサブシーケンスですが、必ずしもサブストリングではないことに注意してください。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例: 「ababccabdc」の場合は「abcabc」になります。これは、「ababccabdc」に「abc」=「abc」と「abc」が(少なくとも)2回表示されるためです。 「addbacddabcd」の場合、「dd」は2回表示されるため、1つのオプションは「dddd」です(同じ文字を複数回使用することはできませんが、ここでは4つの「d」があるので問題ありません)。ただし、lebngth 4です。長さ8の場合: 'abcdabcd'は、 'abcd'が 'addbacddabcd'のサブストリングであるため、2回出現します。 最長の繰り返しサブシーケンスを見つけることに興味があります。これは「最長/最大の正方形を見つける」とも呼ばれますが、正方形が部分列ではなく部分列に対して定義されている多くの記事を読みました。 文字列のブレークポイントのすべてのオプションを反復することでを取るブルートフォースアルゴリズムを簡単に使用できます。次に、最大/最長の共通サブシーケンスを検索する2つの文字列を作成しますが、各チェックは動的プログラミング手法を使用してO (n 2)を取るため、全体の時間はO (n 3)になります。私はO (n 2をとる最も長い共通部分列のためのより効率的なアルゴリズムを見つけましたO(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)なので、実行時間はO(n3O(n2logn)O(n2log⁡n)O(\frac{n^2}{\log n})。O(n3logn)O(n3log⁡n)O(\frac{n^3}{\log n}) 私は最長の繰り返しサブシーケンス問題のためのより効率的なアルゴリズムを探しています。おそらく、すべてのブレークポイントを反復するという私の考えは、時間を浪費しすぎて、反復回数を減らすことができます。あるいは、異なる姿勢のアルゴリズムがこの問題を解決できるかもしれません。 私は多くのジャーナルや以前の質問で検索してきましたが、私が見つけた結果のほとんどは部分列ではなく部分文字列に関するものでした。 これはサフィックスツリーを使用して実行できることも読みましたが、これもサブストリングに関連しており、そのようなアイデアをサブシーケンスに拡張できるかどうかはわかりません。 時間で実行されるソリューションを探しています。時間の1が存在する場合にはO (nは⋅ ログn個)でも良くなる(そのようなものが存在する場合、私はわかりません)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅log⁡n)O(n \cdot \log n)

1
Earleyベクトルから構文木の森を再構築するにはどうすればよいですか?
Earleyベクトルを認識エンジンとして使用するのは非常に簡単です。文字列の最後に達したとき、位置0で開始された公理生成が完了したかどうかを確認するだけです。少なくとも1つある場合、文字列は受け入れられます。 Earleyベクトルを使用して解析ツリーを再構築することは、それほど明白ではありません。実際、私はアルゴリズムの手順がどのように機能するかを理解することはできません。さらに、私が見つけた唯一の参照はあいまいまたは超技術的なものでした。誰かがそれに光を当てることができますか?

4
動的プログラミングの「動的」とは何ですか?
私の先輩の1人が就職の面接を受け、動的と呼ばれる理由を尋ねられました。彼は答えることができず、面接官をあきらめた後、それについて動的なものは何もないと言った、それはちょうどそのように呼ばれた。それは私には信じがたいことです。 これは、副問題が実行時に解決され、最終目標の達成に使用されるという事実を示していますか?実行時に発生する動的メモリ割り当てのように? [回答] 質問する前に、この wikiの記事を読んでおくべきでした。申し訳ありません。

3
最長経路問題に最適な部分構造がない理由は何ですか?
私が最も長いパスについて学習し、問題が最適なサブ構造を欠いていたため、一般的なグラフで最長のパスは動的計画法によって解くことができないという事実に出くわしました(私は文が最長に修正する必要があると思われた簡単な一般的なグラフにパスされていない解けることにより、動的プログラミング)。 それらが単純である必要があると想定する場合(何らかの理由でこれは必要ですが、まだ理解していません)最長であれば、反例を作成するのは簡単です。4つのノードA→B→C→D→Aを持つ正方形グラフを考えてみます。 AからDへの最長パスは、明らかにA→B→CDです。ただし、BからCへの最長パスはB→A→D→Cであり、パスB→C(これは、この場合、実際には最短経路です!)。 これは、パスを単純にする必要があるためにのみ機能するようです。最適な部分構造が存在しないことを証明するために、パスは単純である必要があると想定する必要がありますか? 私は反例が良い証拠/証拠であるはずだと思います(私はそれを否定しません)、私は反例が非常に啓発的であるとまったく思いません。なぜそれが最適な部分構造を許可しないという点を証明するのかはわかりますが、最長経路の最適部分構造がないはずであることが明らかである理由を実際に理解または直感することができません。たとえば、切り取りと貼り付けの引数が機能しないのはなぜですか?サブパスが最も長くない場合は、より長いパスをそのまま使用してください。それはとても魅力的に聞こえます、つまり、私たちがより長いものを配置した場合、もちろんそれは長くなるはずです...しかし、これは何らかの理由で間違っています。この例は実際にDPが決してできないことを実際に証明していますか最長(シンプル?)パスを効率的に解決しますか?私はそれがPにないという一般的な証明を要求しません(それはP対NPソリューションを求めている可能性があるため)。私はちょうどそれその証拠の後だ解くことができないDPによって(またはDPは、この最長経路問題を解決することはできないというか、問題がないことを、少なくとも非常に強力な証拠ではない最適なサブ構造を持っています)。 私はウィキペディアで問題がNP-Hardであることを明確に見てきました。つまり、おそらく高速なアルゴリズムはありません。それが、最適な部分構造に明らかに欠けているべき証拠を提供するために存在する証拠/直感の唯一のタイプであるかどうか(または欠けていない場合、問題をより速くするために使用できないこと)はわかりません。それが高速の動的プログラムで解決できないことを示す唯一の方法ですか? シンプルが必要な理由です私たちがその要件を設けない場合、問題は些細な/興味のないものになるのですか?言い換えると、サイクルがある場合、そのサイクルから到達可能なすべてのノードへの最長パスの問題が(そのサイクルへのパスを見つけることによって)解決されています。到達可能なサイクルがないノードの場合、非循環グラフがあり、これはDPで解決できます(重みが正の場合)。さらに、サイクルがある場合は、自動的に物事が最適な部分構造を持つようになりました(私はそう思います)。最長パスは、2つのケースをカバーする最長パスで構成されているためです。どちらにも最適な部分構造が含まれています。だから、問題は単純なパスを必要とせずに取るに足らないものになったのですか?または、何か不足しているのですか、それとも単純なパスが必要なのかについてのより良い説明がありますか?しない一般的な最長パスは DPで解決できますか? また、DPを使用できないことを保証するために必要な要件は100%わかりません。負のエッジの重み、正の、重み付けされていない、有向、無向である必要がありますか?要件は何ですか?


3
この最適化問題の効率的なアルゴリズム?動的プログラミング?
私が達成しようとしていることを表す図を作成しました。 フルサイズの画像 入力シーケンスでは、ノードは可能な限り互いに接近しています。しかし、私は白いノードをそれぞれの黒いノードにできるだけ近づけたいと思っています。ノード間のエッジを長くすると、このエラーを最小限に抑えることができます。短縮することはできません。したがって、1 -> 2たとえば4以上にすることができます。 可能な解決策を含めました。長くなったエッジにはラベルが付いています。エッジを長くすると、すべてのノードが右に移動することに注意してください。 この軸は連続ですが、それが役立つ場合、私はおそらくそれを離散化することができます。 私は動的プログラミングのアプローチがうまくいくと考えていますが、よくわかりません-私はDPがあまり得意ではありませんでした。 これを解決できる最速の実行アルゴリズムは何ですか?これは、よく知られている問題として分類/再構成できますか?

2
2つのパスが到達できるポイントの最大数
のリストが与えられたとしましょう んnn ポイント、その バツxx そして yyy座標はすべて負ではありません。また、重複するポイントがないとします。ポイントからしか行けない(バツ私、y私)(xi,yi)(x_i, y_i) ポイントへ (バツj、yj)(xj,yj)(x_j, y_j) もし バツ私≤バツjxi≤xjx_i \le x_j そして y私≤yjyi≤yjy_i \le y_j。問題は次のとおりです。んnnポイント、上記のルールを使用してポイントを接続する2つのパスを描画することが許可されている場合に到達できるポイントの最大数はいくつですか?パスは原点から開始する必要があり、繰り返しポイントを含めることができます。(0、0)(0,0)(0, 0) もちろん到達ポイントには含まれていません。 例:与えられた (2、0)、(2、1)、(1、2)、(0、3)、(1、3)、(2、3)、(3、3)、(2、4)、(1、5)、(1、6)(2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6)(2, 0), (2, 1), (1, 2), (0, 3), (1, 3), (2, 3), (3, 3), (2, 4), (1, 5), (1, 6)、答えは 888 私たちは取ることができるので (0、0)→(2、0)→(2、1)→(2、3)→(2、4)(0,0)→(2,0)→(2,1)→(2,3)→(2,4)(0, 0) \rightarrow (2, 0) \rightarrow (2, …

1
サブセット合計、疑似多項式時間動的プログラミングソリューション?
しばらく前にP対NPの問題を発見し、最近サブセットサム問題に取り組みました。サブセット和問題に関するWikipediaの記事と、サブセット和アルゴリズムの質問を読みました 私は問題を見ていくつかの解決策を見つけましたが、今のところそれらはNPのようですが、NP時間で十分に高速なアルゴリズムを作成できると思います。 私の問題は理論的には私が上手ではないので、クック・レビンの定理や非決定論的チューリングマシンについて話すことはあまり役に立ちません。 ウィキペディアにある疑似多項式の時間動的プログラミングのサブセットの合計について説明します。 私はそれを読みましたが、なぜPではなくNPであるかという一般的な概念は理解しています(それを使用した操作ではなく入力のサイズに関連しています)が、アルゴリズムは理解していません。 誰かがいくつかの数字とそれがどのように機能するかを例に挙げていただければ幸いです。それは次のようになるので、それは私に多くの助けになるでしょう: 将来のアルゴリズムを改善するためのアイデアを教えてください アルゴリズムがNPではなく疑似多項式である場合、直感的に理解できるようにしてください。

2
推測ゲーム
私はこの質問を解決していました。以下のとおりです ジョーはリストから整数を選びます 1,2,⋯,N1,2,⋯,N1,2,\cdots,N 確率で pipip_i ピッキングの iii すべてのために 1≤i≤N1≤i≤N1\leq i \leq N。それから彼はジェイソンを与えますKKK彼の数を推測しようとします。推測のたびに、ジョーはジェイソンの推測よりも多いか少ないかをジェイソンに伝えます。ジェイソンがジョーの番号を正しく推測した場合、KKK推測では、ゲームは終了し、ジェイソンが勝ちます。ジェイソンはそうでなければ負ける。ジェイソンがすべてを知っている場合p′ispi′sp_i's 彼が勝つ確率はどれくらいですか? 1≤N≤2000001≤N≤2000001\leq N\leq 200000 1≤K≤201≤K≤201\leq K\leq 20 この問題を動的プログラミングで試しました。しましょうDP[i][j][k]DP[i][j][k]DP[i][j][k] 数が次のようになるような勝率を格納します iii そして jjj 包括的かつ唯一 kkkチャンスが残っています。そう DP[i][j][k]=maxi≤l≤j{pl+DP[i][l−1][k−1]+DP[l+1][j][k−1]}DP[i][j][1]=maxi≤l≤jpl Base CaseDP[i][j][k]=maxi≤l≤j{pl+DP[i][l−1][k−1]+DP[l+1][j][k−1]}DP[i][j][1]=maxi≤l≤jpl Base CaseDP[i][j][k] = \max_{i\leq l\leq j} \{p_l + DP[i][l-1][k-1] + DP[l+1][j][k-1]\}\\DP[i][j][1] = \max_{i\leq l\leq j}p_l\ \quad \quad \text{Base Case} しかし、の範囲が非常に高いため、この解決策は実行できません。したがって、私はソリューションを探していたときに、次のソリューションに遭遇しました(インターネットで受け入れられました)NNNO(n)O(n)\mathcal{O}(n) Sort()p[]p[]p[] …

1
最大サブマトリックス合計
与えられた n×mn×mn\times m マトリックス AAA整数の場合、合計が最大になる部分行列を見つけます。行または列が1つしかない場合、これは最大のサブ配列を見つけることと同じです。 1Dバージョンは、動的プログラミングによって線形時間で解決できます。2DバージョンはO(n3)O(n3)\cal O(n^3) すべての列のペアをループし、長さが行列の行数である配列に対して1Dアルゴリズムを使用して、各位置で rrr 行の要素の合計を保持します rrr 2つの列の間。 行列が次のように与えられた場合: ⎛⎝⎜15−45−243−1203119−1789⎞⎠⎟(1−20−15433178−45−12199)\begin{pmatrix} 1 & -2 & 0 & -1 \\ 5 & 43 & 31 & 78 \\ -45 & -12 & 19 & 9 \end{pmatrix} 次に、列のペアについて (0,2)(0,2)(0,2)、最大サブマトリックスの合計は、配列で1Dアルゴリズムを使用して見つけることができます(上から下)。 ⎛⎝⎜1−2+05+43+31−45−12+19===−179−38⎞⎠⎟(1−2+0=−15+43+31=79−45−12+19=−38)\begin{pmatrix} 1-2+0 & = & -1 \\ 5+43+31 & = …


1
レベンシュタイン距離と動的タイムワープ
ワグナー・フィッシャーアルゴリズムとdtwアルゴの間をどのように平行に描くかわかりません。どちらの場合も、各インデックスの組み合わせ(i、j)の距離を求めます。 ワーグナーフィッシャーでは、空の文字列から別の文字列への挿入回数によって距離を開始します。 let wagnerFischer (s: string) (t: string) = let m, n = s.Length, t.Length let d = Array2D.create (m + 1) (n + 1) 0 for i = 0 to m do d.[i, 0] <- i for j = 0 to n do d.[0, j] <- j for j …

2
行列乗算プログラムの入れ子ループの不変式
Hoareロジックを使用して2つの行列を乗算するためのプログラムの正確性を証明することについて、卒業論文を作成しています。これを行うには、このプログラムの入れ子ループの不変式を生成する必要があります。 for i = 1:n for j = 1:n for k = 1:n C(i,j) = A(i,k)*B(k,j) + C(i,j); end end end 私は最初に内部ループの不変式を見つけようとしましたが、今までは本当のものを見つけることができません。上記のプログラムの不変式を見つけるのを手伝ってくれる人はいますか?
7 algorithms  loop-invariants  correctness-proof  formal-languages  regular-languages  pumping-lemma  logic  logic  programming-languages  lambda-calculus  term-rewriting  operational-semantics  complexity-theory  time-complexity  computability  proof-techniques  reductions  digital-preservation  distributed-systems  storage  algorithms  dynamic-programming  check-my-algorithm  reference-request  cryptography  quantum-computing  formal-languages  regular-languages  context-free  formal-grammars  algorithms  graphs  network-flow  algorithms  data-structures  randomized-algorithms  lists  computability  proof-techniques  undecidability  terminology  distributed-systems  parallel-computing  artificial-intelligence  heuristics  search-problem  algorithms  computational-geometry  algorithm-analysis  asymptotics  recurrence-relation  mathematical-analysis  master-theorem  algorithms  algorithm-analysis  runtime-analysis  computability  reductions  turing-machines  formal-languages  context-free 

2
正方配列の「重複しない」数値の合計を最大化-証明に役立ちます
質問はスタックオーバーフローに掲載されたこの問題を解決するためのアルゴリズムを求めて: nxnの行列(Aと呼びます)があります。行列Aからポイントのサブセット(Bと呼びます)を選択します。サブセットはn個の要素で構成され、Aの各行と各列から1つだけの要素が取得されます。出力はソリューション( B)これらの制約を考慮して、Bを構成する要素の合計が可能な最大値になるようにします(たとえば、以下の例では25)。Bの複数のインスタンスが見つかった場合(つまり、同じ最大合計を与える異なるソリューション)、最大の最小要素を持つBのソリューションを選択する必要があります。 Bは、nxnの選択行列にすることもできますが、n個の目的の要素のみが非ゼロです。 例:A = |5 4 3 2 1| |4 3 2 1 5| |3 2 1 5 4| |2 1 5 4 3| |1 5 4 3 2| => Bは |5 5 5 5 5| 私は動的プログラミングソリューションを提案しましたが、これは他のソリューションと同じくらい効率的だと思います。以下の提案されたアルゴリズムをコピーして貼り付けました。 してみましょうの正方形アレイもでの数字。ああAんんnんんn LETの要素示しにおける行と列目を。あ私、jあ私、jA_{i,j}ああAij LETはの正方形サブアレイの数値非重複の最適和を表す行の交点を含むがにと列がに。S(私1:私2、j1:j2)S(私1:私2、j1:j2)S( i_1:i_2, j_1:j_2 )ああA私1私1i_1私2私2i_2j1j1j_1j2j2j_2 次に、重複しない数値の最適な合計が示さS( 1:n , 1:n )れ、次のように与えられます。 …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.