這是一道區間dp題,題目有小錯誤,字串的長度不是5,而是小於1005的長度。
定義:f[i][j] 為區間[i,j]需要塗色最少的次數
我們可以發現這樣一件事:我們塗色盡量從最兩端的顏色開始塗,雖然無從證明,但是對該題是正確的結論。
假設字串為s,當區間[i,j]兩端顏色相同時,可以先把整段區間塗成該種顏色,所以此時省略一步,即
f[i][j]=min(f[i+1][j],f[i][j-1]);
只有這種情況特殊,之後套用區間dp模板即可:
for
(int l =
1; l <= len; l++)}
}}
要注意預處理,所有的區間先預處理為infinity
並且for i = 1 to len 都有f[i][i]=1
最終**如下
#include
#define ll long long
#define inf 50
#define maxn 45
using
namespace std;
int f[maxn]
[maxn]
;char s[maxn]
;int
main()
}for
(int i =
1; i <= len; i++
)for
(int l =
1; l <= len; l++)}
}}cout << f[1]
[len]
;return0;
}
塗色PAINT 牛客(區間dp,基礎)
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...
演算法學習之路 牆壁塗色
題目大意 蒜頭君覺得白色的牆面好單調,他決定給房間的牆面塗上顏色。他買了 33 種顏料分別是紅 黃 藍,然後把房間的牆壁豎直地劃分成 nn 個部分,蒜頭希望每個相鄰的部分顏色不能相同。他想知道一共有多少種給房間上色的方案。例如,當 n 5n 5 時,下面就是一種合法方案。由於牆壁是乙個環形,所以下面...
1260 CQOI2007 塗色 區間DP
假設你有一條長度為5的木版,初始時沒有塗過任何顏色。你希望把它的5個單位長度分別塗上紅 綠 藍 綠 紅色,用乙個長度為5的字串表示這個目標 rgbgr。每次你可以把一段連續的木版塗成乙個給定的顏色,後塗的顏色覆蓋先塗的顏色。例如第一次把木版塗成rrrrr,第二次塗成rgggr,第三次塗成rgbgr,...