ACWing 282 石子合併

2021-10-19 17:29:56 字數 1194 閱讀 6867

n

nn堆石子排成一排,編號為1∼n

1\sim n

1∼n。每堆石子的個數由乙個非負整數陣列a

aa描述。現在要將這些石子合併為1

11堆,每次可以合併兩堆石子,所消耗的能量是這兩堆石子的總數。問合併為1

11堆為止所消耗的能量的最小值。

輸入格式:

第一行乙個數n

nn表示石子的堆數n

nn。第二行n

nn個數,表示每堆石子的質量(均不超過1000

1000

1000

)。輸出格式:

輸出乙個整數,表示最小代價。

資料範圍:

1 ≤n

≤300

1\le n\le 300

1≤n≤30

0 思路是動態規劃。設f[i

][j]

f[i][j]

f[i][j

]是合併第i

ii堆到第j

jj堆成為1

11堆所需要的最小能量。那麼可以按照最後一次合併的分界線來分類,有:f[i

][j]

=min⁡i

≤k≤j

−1

f[i][j]=\min_\

f[i][j

]=i≤

k≤j−

1min

​最後返回f[1

][n]

f[1][n]

f[1][n

]即可。初始條件是∀i,

f[i]

[i]=

0\forall i, f[i][i]=0

∀i,f[i

][i]

=0。**如下:

#include

using

namespace std;

const

int n =

310;

int n;

int s[n]

;int f[n]

[n];

intmain()

cout << f[1]

[n]<< endl;

return0;

}

時間複雜度o(n

3)

o(n^3)

o(n3

),空間o(n

2)

o(n^2)

o(n2)。

acwing 282 石子合併(區間dp)

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...

ACwing 282 石子合併(區間dp

給出n堆石子,每次只能合併相鄰的兩堆石子,代價為兩堆石子的質量和,求合併所有石子的最小代價。區間dp中i,j表示的是兩個區間的左右端點,操作物件是區間。dp i j 表示合併第i堆石子到第j堆石子的最小代價。對於i,j圍成的區間,以合併的分割線區分不同合併方式,相當於在i,j中插入一塊隔板,dp i...

ACwing 282 石子合併(區間DP)

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...