题意是给你一堆石子,每次合并都只合并相邻的两堆,代价是两堆的石子质量,问你合并到最后(合并到一堆)最小代价为多少
因为最后都要划归到一个问题上,就是合并到最后是左右两边连续的区间,这可以想到区间dp
令f【i,j】为把从i到j的这一段合并的最小代价
整个石子,从1到n,有很多个区间,所以这个时候需要枚举区间然后对每个ij分别进行计算
对于从i到j这单独的一个区间,刚刚上面也说了。对于一个区间它最后的分法必然是左边的连续的一段和右边连续的一段。
所以对于这个[i,j]来说,设这个区间的分界点是k,然后一个整区间i,j可以变成[i,k]和[k+1,j],
———k——————
如图上面的两段,那f[i,j]=f[i,k]+f[k+1,j]+s[i,j]
就是先有两堆,两堆的代价分别是f[i,k]和f[k+1,j]然后两堆要合并到一堆,那没有区别,直接全部都加起来好了
#include<iostream>
using namespace std;
const int N=500;
int f[N][N],a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]+=a[i-1];
}
for(int