Module: 動的プログラミングのパターン - 2


Problem

1 /5


フィルゲーム

Theory Click to read/hide

免責事項: 以下に説明する方法は普遍的なものではありませんが、多くの場合、問題を解決したり、適切な解決策を見つけるのに役立ちます.

配列を最適に破棄/崩壊/結合 (または同様の) する必要がある問題の場合は、サブセグメントに対する動的プログラミングを使用して問題を解決する必要があります。

dp[l][r] を取得しましょう。これは、l から r までのインデックスを持つサブセグメントの最適解です。ダイナミクスの再計算はタスクに大きく依存しますが、次のような一般的な考え方があります。

1) 極端な要素 l と r を見てください。それらが他の方法で一致または補完する場合、dp[l+1][r-1] を介して dp[l][r] の値を更新できる可能性が高くなります。それ以外の場合は、dp[l][r-1] または dp[l+1[r] 経由で。

2) セグメント [l;r] が単一の構造では表現できないことがよくあります。次に、このサブセグメントの考えられるすべてのセクションを 2 つの部分に分けて検討する必要があります。つまり、要素 k を l から r-1 まで繰り返し、dp[l][r] から dp[l][k] および dp[ を再計算します。 k+1][r] 。より小さなサブセグメントでは、これらのセクションも整理されているため、実際には、サブセグメント [l;r] を 2 つの部分に分割するだけでなく、任意の数の部分に分割するオプションも考慮されます。
 

Problem

左から右に 1 から n までの番号が付けられた n 個の色付きの正方形で作られた市松模様の紙のストリップが与えられます。 i 番目の正方形は、最初は ci に色付けされています。

c= cj かつ c= ck の場合、正方形 i と j は同じ要素にあると言えます i < を満たすすべての k について。 k < j.つまり、i から j までのセグメント上のすべての正方形は同じ色でなければなりません。
たとえば、ストリップ [3,3,3] には 1 つの連結要素があり、[5,2,4,4] には 3 つの連結要素があります。

フィルゲームこのストリップでは次のように再生されます:
ゲームの開始時に、1 つのランダムな開始マスを選択します (これはターンとしてカウントされません)。
次に、移動するたびに、最初の正方形を含む連結要素の色を別の色に変更します。

ストリップ全体を 1 色に塗り替えるのに必要な最小手数を見つけてください。

入力:
最初の行には、単一の整数 n (1 ≤ n ≤ 5000) が含まれています。正方形の数。

2 行目には整数 c1,c2,…,cn (1 ≤ ci > <5000) —正方形の初期色。

出力:
単一の整数を出力します —最小手数。

例:
  <本体>
説明:
最初の例の最適な方法の 1 つ: [5, 2, 2, 1] -> [5, 2, 2, 2] -> [5、5、5、5]
入力 出力
4
5 2 2 1
2
8
4 5 2 2 1 3 5 5
4
1
4
0