傳送門
題目描述
假設你有一條長度為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,...