在乙個操場上一排地擺放著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...