SSL 2863合併石子

2021-10-11 19:08:13 字數 1982 閱讀 1924

time limit:10000ms

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

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

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

781621418

這道題要用動態規劃,有三種方法,都要用3重迴圈。

法1和法2,f[i][j]表示合併第i~j堆石子的得分,f[i][j]=min(f[i][i]+f[i+1][j],f[i][i+1]+f[i+2][j],……,f[i][j-1],f[j][j])

1<=i<=n,1<=j<=n;

法1:先列舉長度,再列舉左邊界

法2:2重迴圈列舉左右邊界

法3:f[i][j]表示合併第i~i+j-1堆石子的得分,f[i][j]=min(f[i][1]+f[i+1][j-1],f[i][2]+f[i+2][j-2],……,f[i][i+(j-1)],f[i+(j-1)][j-(j-1)])

1<=i<=n,1<=j<=n;

第3重迴圈,將第i至j堆石子視為合併第i堆石子和第i+1至j堆石子或第i至i+1堆石子和第i+2~j堆石子……或第i至j-1堆石子和第j堆石子。

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int n,sum[

200]

,stone[

200]

,f[200][

200]

;void

input()

return;}

voiddp(

)}}printf

("%d"

,f[1

][n]);

return;}

intmain()

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int n,sum[

200]

,stone[

200]

,f[200][

200]

;void

input()

return;}

voiddp(

)}}printf

("%d"

,f[1

][n]);

return;}

intmain()

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int n,sum[

200]

,stone[

200]

,f[200][

200]

;void

input()

return;}

voiddp(

)}}printf

("%d"

,f[1

][n]);

return;}

intmain()

ssl2863 石子合併 dp練習

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

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

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

SSL 合併石子

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