文字列の切断に関する動的プログラミング演習


16

私はこのから次の問題に取り組んできました。

特定の文字列処理言語は、文字列を2つの部分に分割する基本的な操作を提供します。この操作には元の文字列のコピーが含まれるため、カットの位置に関係なく、長さnの文字列に対してn単位の時間がかかります。今、文字列を多くの部分に分割したいとします。休憩が行われる順序は、合計実行時間に影響を与える可能性があります。あなたがた位置に20文字の文字列をカットしたい場合たとえば、と、その後の位置に最初のカットを作り、負うの総コスト位置10をしている間、最初のより良いコスト持ち。33 20 + 17 = 37 20 + 10 = 3010320+17=3720+10=30

カットが与えられ、ストリングを個にカットする最小コストを見つける動的プログラミングアルゴリズムが必要です。m + 1mm+1

回答:


10

基本的な考え方は、最初の選択としてすべてのカット位置を試して、それぞれの部品を再帰的に解決し、コストを追加して最小値を選択します。

式で:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], そうしないと

適用することに留意されたいメモ化をこの再帰には、実際に解決され、同じ3つの部分問題の削減をもたらす任意の連続印加ペアの順序を切り替えるように作業を保存します。


1

最初に再帰アルゴリズムを見つけてから、テーブルに変換することをお勧めします。

  1. fCn
  2.    if(C =)は0を返します;
  3.   
  4.      opt =無限;
  5.     各に対してcC
  6.       D={dCd<c}
  7.       E={eceDe>c}
  8.       opt=mn{optfDc+fEnc}
  9.      return ;opt+n

それで、あなたは尋ねるかもしれません:テーブルに入れるにはCのサブセットが多すぎませんか?「連続した」サブセットのみが必要であることに注意してください。そして、そのうちのだけが(理由)。別の問題は、いくつかのエントリが値を変更することです。長さを指定するだけでなく、各開始と終了を示すことにより、これを回避できます。n2Ef


0

これは、マルチセットのQuicksortに非常に似ています。カットポイントが中央に最も近い場合に最適であり、再帰します。

シャッフルバージョンのマルチセットM = {1,1,1..1,2,2 ... 2、....、m、m..m}を指定した場合、各カットポイントでランが終了します、中央に最も近いカットピボットとして選択することにより、最適なクイックソートを行います。要素を左右のパーティションに分割する操作は、文字列分割と同じ方法でn回の操作を行うため、Quicksortと同じ引数を使用して中央値が最適であることを示すことができます。 sk

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