依旧水水的dp5
| Time Limit: | 1000MS | Memory Limit: | 65536KB |
|---|---|---|---|
| Total Submissions: | 59 | Accepted: | 43 |
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;
}
\