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

4
動的プログラミングに適している問題をどのように特定しますか?
私は最近、動的プログラミングについて読んでいます。ゼロから始めて、現在DP問題の特定と解決が得意な人の話を聞きたいです。私はこれらの問題をDPとして特定し、簡潔な解決策を組み立てるのに苦労しています。 私は初心者のDPの問題とMITのリソースなどのほとんどを経験しました

3
文字列の数、各文字が偶数回出現する必要がある場合
私はしばらくの間、この問題に頭蓋骨をぶつけてきましたが、それは本当に私を苛立たせ始めています。問題は: 私は、文字のセットを持ってA、B、C、とD。長さがnあり、各文字が偶数回出現する必要がある場合、これらの文字から文字列を構築する方法をいくつも教えなければなりません。 たとえば、の答えn = 2は4です。 AA BB CC DD の答えn = 4は40です。これらの有効な文字列の一部は次のとおりです。 AAAA AABB CACA DAAD BCCB 私は論理を思いつくのに行き詰まっています。このためのDPソリューションがあると思います。これを介して私の方法を総当たり的にすることは問題外です:ソリューションの数は急速に膨大な数に成長します。 私はあらゆる種類のアイデアを紙に描いてみましたが、役に立ちませんでした。それらのほとんどすべては、それらの複雑さが大きすぎるために破棄しなければなりませんでした。ソリューションは、に対して効率的である必要がありますn = 10^4。 私のアイデアの1つは、実際の文字列を追跡するのではなく、各文字が偶数回または奇数回出現したかどうかを追跡することでした。このロジックを適用する方法を思いつきませんでした。 誰か助けてもらえますか?

2
動的プログラミングの問題を解決する方法
私は最近この質問に出くわしました。「シンボルの文字列で構成されるブール式が与えられます。true、false、and、or、xor。括弧で囲む方法の数を数えますtrueと評価されるような式。たとえば、trueと評価されるように 'trueとfalse xor true'を括弧で囲むには2つの方法があります。 私はそれが動的プログラミングの問題であることを知っていたので、次のような自分で解決策を考え出そうとしました。ABC .... D where '。'のような式があるとします。操作のいずれかを表します。または、xorおよび大文字はtrueまたはfalseを表します。このサイズKの式がtrueを生成する方法の数はNであるとしましょう。新しいブール値Eがこの式に追加されると、この新しい式1を括弧で囲む2つの方法があります((ABC .... D) .E)つまり ABC .... Dの可能なすべての括弧で、最後にEを追加します。2.(ABC(DE))すなわち まずDEを評価してから、サイズKのこの式が真を生成する方法の数を見つけます。 T [K]がサイズKの式がtrueを生成する方法の数であるとすると、T [k] = val1 + val2 + val3で、val1、val2、val3は次のように計算されます。 1)EがDとグループ化されている場合。 i)Dの値を変更しない ii)Dの値を逆にします 最初のケースではval1 = T [K] = Nです(これは最初のABC ... D式に減少するため)。2番目のケースでは、Dの値を逆にしてdp [K]を再評価します。これはval1です。 2)Eが式全体とグループ化されている場合。 // val2には、「true」の数が含まれます。Eは、括弧で囲まれたABCのすべてのインスタンスの中で「true」を与えた式で生成されます...... D i)true.E = trueの場合、val2 = N ii)true.E = falseの場合、val2 = …

2
動的プログラミング手法を使用して、「ピザピッキングの問題‍」をどのように解決しますか?
ウィンクラーのピザピッキング問題: nスライスの円形ピザパイ。スライスにiは面積があります。S_iつまり、面積はパイのピースごとに異なります。 食べる人のアリスとボブは交互にスライスを選んでいますが、パイに複数のギャップを作るのは失礼です(許可されていません)。 したがって、各イーターは、オープン領域に隣接する2つのスライスの1つを取得するように制限されています。アリスが最初に行き、両方の食べる人はできるだけ多くのパイを探します。 ピザの消費を最大化するためにアリスとボブの両方が完璧にプレーした場合、動的プログラミングアルゴリズムはアリスが食べるパイの量をどのように決定しますか? 私の理解: 一般的なDP問題では、再帰ツリーを使用して、またはより厳密にはDAGを使用して視覚化できるサブ問題を見つけます。ここで、私はここで副問題を見つけるためのリードを見つけていません。 ここで、S_iの特定のセットについて、Aliceが食べるスライスの領域を最大化する必要があります。これは、(n-1)個の順列からPizzaスライスの順列を選択することに依存します。アリスが取得するn \ 2ターンごとに使用可能な2つのオプションから最大面積スライスを選択すると、順列のスライスの総面積が得られます。そのようなすべての順列についてスライスの領域を見つける必要があります。そして、これらのうち最大のもの。 誰かが私を前進させる方法を手伝ってくれる?

3
文字列なしの最長サブシーケンス
サブストリングとしてYを含まないストリングXで最長のサブシーケンスを見つける動的プログラミングアルゴリズムはありますか?この問題は、最長の共通サブシーケンスや文字列など、他のDP文字列アルゴリズムと非常に似ているように見えます。オーバーラップするYの発生を処理できる必要があります。 これは2状態のDP問題である可能性があります。状態[s_pos、t_pos]は、ストリングT [t_pos..M]をサブストリングとして持たないs_posで始まるストリングSの最も長いサブシーケンスです。Nは文字列Sの長さ、Mは文字列Tの長さです。ただし、私の遷移は正しくありません。S= aaabcおよびT =の場合は取得されませんaabc。問題はelseステートメントにあります -文字が等しい場合に遷移する方法がわかりません。実際、私はifブランチが間違っていると感じています...誰が間違っているのか知っていますか? S = aaabおよびT =の場合も失敗しますaab。失敗する理由を説明できます。solve(0、0)を呼び出すと仮定します。solve(0、0)はsolve(1、1)を呼び出します。solve(1、1)はsolve(2、2)を呼び出します。s [2]!= t [2]なので、solve(3、0)から検索を再開します。ただし、aabは部分文字列であり、これをチェックしたり、このケースを考慮したりすることはありません... int solve(int s_pos, int t_pos) { if (s_pos >= N || t_pos >= M) return 0; if (t_pos == M - 1 && s[s_pos] == t[t_pos]) return 0; int ret = 0; if (s[s_pos] != t[t_pos]) { …

1
パターンを文字列に挿入するすべての可能な方法を見つける
私はしばらくの間この問題について考えていましたが、再帰的な解決策しか見つけることができませんが、それを行うための動的なプログラミング方法があると感じていますが、それを理解することはできません。これは私が知らない有名な問題ですか? Q:文字列とパターンを指定して、パターンの文字を(順番に)文字列と照合する一意の方法の数を返します。 明確化:一致を見つけるには、パターンの最初の文字を取り、文字列内で最初に一致する文字を見つけ、次にパターンの2番目の文字を取り、以前に一致した後の文字列の最初の一致文字と一致します。キャラクター。 例1(4件一致): 文字列:DABBCDDE パターン:ABD 可能な方法(太字はパターンが文字列と一致する場所です): D AB BC D DE D A B B C D DE D AB BCD D E D A B B CD D E 例2(0件一致): 文字列:ABC パターン:BCA (B、Cに一致し、文字列の最後にいる場合、前の文字に戻って一致することはできません) 再帰的なアプローチでは、パターン(pIndex)だけでなく、文字列(sIndex)の現在のインデックスを追跡するメソッドがあります。string [sIndex]がpattern [pIndex]と一致する場合は、メソッドを再度呼び出して、sIndexとpIndexを増やします。そうでない場合-sIndexを増やして、もう一度一致を見つけるようにしてください。再帰呼び出しの戻り値が加算されるため、メソッドは合計数を返します。(一致は1を追加、一致は0を追加) 基本ケース: pIndexがパターンの長さより大きい場合、0を返します。 sIndexが文字列の長さより大きい場合、1を返します(一致が見つかりました!) 他にどんな解決策がありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.