假設你有一條長度為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 第一眼看資料範圍還以為是大...