區間dp P4170 CQOI2007 塗色

2021-09-26 10:34:02 字數 1177 閱讀 8701

傳送門

題目描述

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅、綠、藍、綠、紅色,用乙個長度為5的字串表示這個目標:rgbgr。

每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,達到目標。

用盡量少的塗色次數達到目標。

輸入格式

輸入僅一行,包含乙個長度為n的字串,即塗色目標。字串中的每個字元都是乙個大寫字母,不同的字母代表不同顏色,相同的字母代表相同顏色。

輸出格式

僅一行,包含乙個數,即最少的塗色次數。

輸入輸出樣例

輸入 #1 複製

aaaaa

輸出 #1 複製

1輸入 #2 複製

rgbgr

輸出 #2 複製

3說明/提示

40%的資料滿足:1<=n<=10

100%的資料滿足:1<=n<=50

題解

1.本題題意:區間內的塗色次數。這很明顯!–區間dp。

狀態很好定義,就是f[i][j]表示從i到j的塗色次數。

2.需要注意的是,本題要求的是最優解,但是塗色是以區間的形式,那麼如果區間兩端要求塗的顏色相同,就可以直接從兩個子區間轉移過來。

如下

if

(vi[i]

==vi[j]

)

3.初始化每個區間長度為1的區間最小值都應該是1

4.狀態轉移方程,直接在i到j之間列舉乙個k就行:

for

(int k=i;k)

5.附上ac**+注釋

#include

#include

#include

#include

#define maxn 105

using namespace std;

char vi[maxn]

;int len=0;

int f[maxn]

[maxn]

;int

main()

else}}

cout<[len-1]

;return0;

}

P4170 CQOI2007 塗色 區間dp

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...

P4170 CQOI2007 塗色 題解

同步 原題鏈結 簡要題意 一開始你有乙個長度為 n nn 的無色串,每次可以對乙個區間染上相同的顏色。問最少多少次可以形成目標串。告訴你,這題的藍是假的,太假了,資料也太弱了。完全是個暴力選手亂碾標算用的,其實本題的時間複雜度完全可以做到 o n 3 o n 3 o n3 第一眼看資料範圍還以為是大...

洛谷P4170 CQOI2007 塗色

假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...