SSL 2863 合併石子 區間動態規劃

2021-08-13 15:58:09 字數 1219 閱讀 8173

在乙個操場上一排地擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請設計乙個程式,計算出將n堆石子合併成一堆的最小得分。

每組資料第1行為乙個正整數n(2<=n<=100),以下n行,每行乙個正整數,小於10000,分別表示第i堆石子的個數(1<=i<=n)。

對於每組資料輸出乙個正整數,即最小得分

7 13

7 8

16 21

4 18

因為這道題只能選相鄰的兩堆石子合併,所以不能像合併果子那樣用貪心做。 這是一道區間動態規劃,動態轉移方程為f[

i][j

]=mi

n(f[

i][j

],f[

i][k

]+f[

k+1]

[j]+

s[j]

−s[i

−1])f[

i][j

]=mi

n(f[

i][j

],f[

i][k

]+f[

k+1]

[j]+

s[j]

−s[i

−1])

,kk

從i到j-1區間迴圈。

#include

#include//max,min的呼叫庫

#include

using

namespace

std;

const

int mm=101;

int f[mm][mm],s[mm],n,i,j,k,x;

int main()

while (i//輸入

memset(f,127/5,sizeof(f)); //給f賦乙個較大的值,注意memset的應用

for (int i=1;i<=n;i++) f[i][i]=0; //記得給f[i][i]賦初值0,不然會出錯

for (i=n-1;i>=1;i--)

for (j=i+1;j<=n;j++)

for (k=i;k<=j-1;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]);

return

0;}

SSL 2863合併石子

time limit 10000ms memory limit 256000k在乙個操場上一排地擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請設計乙個程式,計算出將n堆石子合併成一堆的最小得分。每組資料第1行為乙個正...

ssl2863 石子合併 dp練習

description 在乙個操場上一排地擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。請設計乙個程式,計算出將n堆石子合併成一堆的最小得分。input 每組資料第1行為乙個正整數n 2 n 100 以下n行,每行乙個...

合併石子 (區間覆蓋DP)

任重而道遠 在乙個操場上一排地擺放著 堆石子。現要將石子有次序地合併成一堆。規定每次只能選相鄰的 堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的得分。計算出將 堆石子合併成一堆的最小得分。第一行為乙個正整數n 2 100 以下 行,每行乙個正整數,小於10000,分別表示第i堆石子的個數 1...