FAFU OJ 依旧水水的dp5

109 阅读1分钟

依旧水水的dp5

Time Limit:1000MSMemory Limit:65536KB
Total Submissions:59Accepted:43

Share

Description:

      有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费最小。

Input:

第一行一个整数N,代表有N堆石子。1 ≤ N ≤ 100 第二行有N个正整数,第i个数代表第i堆的石子数量。

Output:

最小花费的代价。

Sample Input:

63 4 6 5 4 2

Sample Output:

61

Source:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 105

int n,a[N],d[N][N];

int main()
{
	scanf("%d",&n);
	a[0] = 0;
	for(int i = 1;i<=n;i++)
		scanf("%d",&a[i]);
	memset(d,0x7f,sizeof(d));
	for(int i=1;i<=n;i++)
	{
		a[i]+=a[i-1];
		d[i][i]=0;
	}
	for(int l=1;l<n;l++)
	{
		for(int i=1;i<=n-l;i++)
		{
			int j=i+l;
			int tmp=a[j]-a[i-1];
			for(int k=i;k<j;k++)
				d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]+tmp);
		}
	}
	printf("%d\n",d[1][n]);
	return 0;
}


\