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]
=mini
≤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 ...