洛谷 P4170 CQOI2007 塗色

2022-05-21 06:34:15 字數 1372 閱讀 4585

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例#1:複製

aaaaa

輸出樣例#1:複製

1

輸入樣例#2:複製

rgbgr

輸出樣例#2:複製

3

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

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

題解:這個題目,我們可以發現,每次如果出現重複的字母在一起那麼他們塗改的次數是一樣的,如hhr和hr,都只需要2次,所以我們可以將字串先unique。

我們設dp[i][j]表示將i~j塗改合法的最小次數,那麼區間套路的轉移dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]),然後乙個轉移通過樣例就可以想到,如果i和j的顏色相同,我們可以,先一次塗完i和j,然後將i~j之間塗成最優dp[i][j]=min(dp[i][j],dp[i+1][j-1]+1)

,但發現還是wa的,如frfutauf。

所以發現如果i,j相同,就可以修改之前的操作,可以一開始,就把i和j塗道,dp[i][j]=min(dp[i][j],min(dp[i+1][j],dp[i][j-1]));

**:

#include #include 

#include

#include

#include

#include

#define maxn 55

#define ll long long

using

namespace

std;

ll dp[maxn][maxn];

char

a[maxn];

intmain()

}printf(

"%lld

",dp[1

][len]);

return0;

}

洛谷P4170 CQOI2007 塗色

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

洛谷 P4170 CQOI2007 塗色

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

P4170 CQOI2007 塗色 題解

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