區間DP 石子合併

2022-06-30 17:48:11 字數 674 閱讀 5208

狀態表示的時候表示的是某一段區間。

動態規劃:

1、狀態表示:f[i, j] 第i堆到第j堆的區間

1)集合:所有將第i堆和第j堆石子合併成一堆石子的 合併方法的集合

2)min: 所有合併方式代價的最小值

2、狀態計算:f[1][n]就是所求的,從第1堆一直合併到第n堆的合併方式的最小值。

最後一定是將兩堆合併成一堆,將最後一次合併作為分界線。

[i, k], [k + 1, j]把這最後一步去掉,然後求最小值:f[i, k] + f[k + 1, j] + s[j] - s[i - 1]

然後f[i, j] = min, k = i ~ j - 1

時間複雜度:狀態兩維 o(n^2 * k) = o(n^2 * n) = o(n ^ 3) = 2.7 * 10^7

輸入樣例:

4

1 3 5 2

輸出樣例:
22
#include #include 

using

namespace

std;

const

int n = 301

;int

f[n][n], s[n];

intmain()

cout

<1][n]<}

石子合併 (區間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 個數,分別表示...