合并石子

来源:互联网 发布:新四大发明 知乎 编辑:程序博客网 时间:2024/05/17 06:37
Problem Description
在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。请设计一个程序,计算出将N堆石子合并成一堆的最小得分。
Input
输入有多组数据,每组数据第1行为一个正整数N(2<=N<=100),以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1<=i<=N)。
Output
对于每组数据输出一个正整数,即最小得分
Sample Input
7
13
7
8
16
21
4
18
Sample Output

239

#include<iostream>   #include<stdio.h>using namespace std;#define M 104#define INF 1000000000int n,dp[M][M],sum[M],stone[M];inline int min(int a,int b){return a>b?b:a;}int main(){//freopen("b.txt","r",stdin);int i,j,k,t,len;while(scanf("%d",&n)==1){memset(sum,0,sizeof(sum));for(i=1;i<=n;i++){scanf("%d",&stone[i]);sum[i]=sum[i-1]+stone[i];}memset(dp,0,sizeof(dp));for(len=2;len<=n;len++)//归并的石子长度{for(i=1;i<=n-len+1;i++)//i为起点,j为终点{j=i+len-1;dp[i][j]=INF;for(k=i;k<=j;k++)dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]);}}printf("%d\n",dp[1][n]);  }return 0;}


0 0
原创粉丝点击