版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82051782
前言
填坑。。。
链接
http://codevs.cn/problem/1048/
大意
给定一堆石子,每次可以选择相邻的石子合并成一大堆石子,花费的代价是它们的代价和,问合并成一堆的最小代价。。。
思路
区间
做法直接动态规划,方程
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int x,s[101],n,f[101][101];
signed main()
{
memset(f,127/3,sizeof(f));
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",&x),s[i]=s[~-i]+x,f[i][i]=0;//预处理前缀和
for(register int i=n-1;i>0;i--)
for(register int j=i+1;j<=n;j++)
for(register int k=i;k<j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[~-i]);//动态规划
printf("%d",f[1][n]);
}