區間dp(石子合併,BZOJ 1260 塗色)

2021-10-17 20:33:37 字數 1330 閱讀 1431

石子合併

思路:

1;l)//區間dp

for(

int i=

1,j=

1+l;j<=n;i++

,j++

)for

(int k=i;k

) f[i]

[j]=

min(f[i]

[j],f[i]

[k]+f[k+1]

[j]+s[j]

-s[i-1]

);printf

("%d\n"

, f[1]

[n])

;return0;

}[cqoi2007]塗色paint

題意:

開始你有乙個空白字串,每次可以選擇一段區間[l,r]進行塗色,問最少塗色幾次會形成字串s(塗色會覆蓋)

思路:

刷子的特點是每次給相鄰區間染一樣的顏色,我們假設剛開始每個點都是單獨刷的,即f[i][i]=1,之後用區間dp來倒推:如何優化塗色方式來實現塗色次數最少

f [i

][j]

f[i][j]

f[i][j

]表示i~j

i~ji~

j區間內變成目標狀態刷的次數

乙個區間左右兩端的顏色可能是什麼關係:

**:

#include

#include

using

namespace std;

int f[

1000][

1000];

char s[

10000];

intmain()

} cout<

[n];

return0;

}

借鑑文章

石子合併 (區間DP

問題描述 在乙個操場上擺放著一行共n堆的石子。現要將石子有序地合併成一堆。規定每次只能選相鄰的兩堆合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請編輯計算出將n堆石子合併成一堆的最小得分和將n堆石子合併成一堆的最大得分。輸入檔案 輸入第一行為n n 1000 表示有n堆石子,第二行為n個用空...

石子合併 區間dp

有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。假設dp 1 4 表示將區間1 4的石子合併所花費的代價。dp 1 4 可以劃分為dp 1 1 dp 2...

石子合併 (區間DP)

題目鏈結 描述 有n堆石子排成一排,每堆石子有一定的數量。現要將n堆石子並成為一堆。合併的過程只能每次將相鄰的兩堆石子堆成一堆,每次合併花費的代價為這兩堆石子的和,經過n 1次合併後成為一堆。求出總的代價最小值。輸入第一行有乙個整數n,表示有n堆石子。接下來的一行有n 0 n 200 個數,分別表示...