根据题意要求的是将石子合并的最小权值,我们可以根据DP思想使用二维数组f[i,j]来存放所有从第i堆石子到第j堆石子合并成一堆石子的合并方式。
然后由第二个图所示,我们可以将i到j区间分成两个区间,因为将i到j合并成一个区间的前一步一定是合并前两个区间。因此我们可以将状态计算的递归定义为区间的中间,通过变化区间的中间来寻找合并i到j的最小值。
也就是f[i,j]=min(f[i,k]+f[k+1,j]+s[j]-s[i-1]
例题:https://www.acwing.com/problem/content/284/
#include<iostream>
using namespace std;
const int N=310;
int n;
int f[N][N];
int s[N];
int main()
{
cin>>n;
int a;
for(int i=1;i<=n;i++) //前缀和
{
scanf("%d",&a);
s[i]=s[i-1]+a;
}
for(int len=2;len&