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...