1. 程式人生 > >【codevs 2102】石子歸併

【codevs 2102】石子歸併

題目描述 Description
有n堆石子排成一列,每堆石子有一個重量w[i], 每次合併可以合併相鄰的兩堆石子,一次合併的代價為兩堆石子的重量和w[i]+w[i+1]。問安排怎樣的合併順序,能夠使得總合並代價達到最小。

輸入描述 Input Description
第一行一個整數n(n<=100)

第二行n個整數w1,w2…wn (wi <= 100)

輸出描述 Output Description
一個整數表示最小合併代價

樣例輸入 Sample Input
4

4 1 1 4

樣例輸出 Sample Output
18

區間DP
列舉斷點,字首和優化。

#include<iostream>
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=500+5; int f[maxn][maxn],s[maxn]; int n; int main() { int x; memset(f,0x3f3f3f3f,sizeof(f)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); s[i]=s[i-1
]+x; } for(int i=1;i<=n;i++) f[i][i]=0; for(int l=1;l<=n;l++) { for(int i=1;i<=n-l;i++) { int j=i+l; for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]); } } int ans=0x3f3f3f3f; ans=f[1
][n]; printf("%d\n",ans); return 0; }