石子合併
思路:
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 個數,分別表示...