P4170 [CQOI2007]着色

タイトル説明

あなたはボード5の長さは、最初はどんな色で塗られていないと仮定します。RGBGR:あなたはこの目標ことを示している5の文字列で、赤、緑、青、緑、赤の塗装されて、それの長さの5台にしたいです。

あなたは連続したボードは、コーティングカラーを適用した後、指定した色を塗っ置くことができるたびに最初の色をカバーしています。例えば、ボードがRRRRRを塗られている最初の時間は、第2、第3の目標を達成するために、RGBGR塗装、RGGGRを描きました。

カラーリングはあまり疲れ数が目標に達しました。

入力形式

長さn、即ち、ターゲット着色の文字列を含む入力ラインのみ。文字列の各文字は大文字で、異なる文字が同じ文字は同じ色を表現し、異なる色を表しています。

説明/ヒント

データ満足の40%:1 <= N <= 10

100%のデータを満たす:1 <= N <= 50

解決

水の問題は、第二のカットしかし、それはまだ非常にシンプルな1つの区間DPです。

あなたは自然を保証することができますので、私たちが色を塗ったびに、そのような以下のための最良の選択は、色の範囲を申請したことを、貪欲な小さなローカルを考えるのは簡単:各操作はマルチカラーを最大限にします。三つのセクションの要件を満たすために、このような塗布方法まで。カラーコーティングされたせいぜい数:有用な特性ないようです\(N \)回。

IMG

そして、このような場合、以下の、せいぜい二つの部分のそれぞれの要件を満たしています。

IMG

だから我々は、着色への最初のオプションを選択しているたびに、チャネル間隔DPで明らかです。

セット\(DP [L] [R ] \) の間隔を表す\(L \シムrは\)完全に、着色の最小必要数の要件を満たします。:明らかに、我々は、状態遷移方程式を描くことができる
\ [DP [L] [R&LT] = {LのMIN_ <= K <R&LT}(DP [L] [K]、DP [K + 1] [R&LT])\]
初期化:1配列、すなわち、各ブラシの位置を再度初期化します。

これは、二つのサブ間隔が完全に要件を満たしていなければならないため、私たちはライン上で最高の統合プログラムの統合への直接アクセスを持っている、シンプルな間隔DPの結論です。

しかし、唯一の書き込みが最適ではない、あなたも、すべてのオーバーサンプリングすることができませんでした。

私たちは、上記の法則に従い転送は、我々は再びそれぞれの場所を忘れていて、一度塗装コーティングはナンセンス(の範囲で可能であることは明らかである、考える。あなたのアカウントに同じ色の部分の二つの端点の要件を取る場合、最適解のために、そして実際には一度塗っが存在する必要があります\(L \ SIM R \)このセクションの、そして私たちは、期間中にチューブを使用しない方法を塗布法である、我々はそれらの間の間隔を知っていますライン上に塗布した後。

従って転送:
\ [分= DP [L] [R&LT]を、C_L C_R ==を\(DP [1 + L] [R&LT]、DP [L] [R&LT-1]。。)]
前記\(C \)がありますスポットカラー。

参照コード

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
using namespace std;
char c[60];
int n,dp[60][60];
int main()
{
    cin>>c+1;
    n=strlen(c+1);
    for(int i=1;i<=n;++i)
     for(int j=1;j<=n;++j) dp[i][j]=1;
    for(int len=2;len<=n;++len)
     for(int l=1;l<=n-len+1;++l){
        int r=l+len-1,tmp=INF;
        if(c[l]==c[r]) dp[l][r]=min(dp[l+1][r],dp[l][r-1]);
        else {
            for(int k=l;k<r;++k)
                if(tmp>dp[l][k]+dp[k+1][r]) tmp=dp[l][k]+dp[k+1][r];
            dp[l][r]=tmp;
         }
     }
    printf("%d\n",dp[1][n]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/DarkValkyrie/p/11285707.html