演算法學習 區間dp 塗色PAINT

2021-10-08 23:49:49 字數 986 閱讀 3381

這是一道區間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,...