AcWing 282. 石子合并
原题链接
简单
作者:
魔仙哥
,
2024-10-09 17:11:16
,
所有人可见
,
阅读 1
#include<bits/stdc++.h>
using namespace std;
const int N = 305;
typedef long long LL;
#define pb push_back
#define F(i,a,b) for(int i=a;i<=b;i++)
#define dF(i,b,a) for(int i = b;i>=a;i--)
// 状态 f[i][j]表示合并[i,j]区间的石子所需的最小代价
// 初始化 f[i][i] = 0
// 转移 f[i][j] = min(f[i][k]+f[k+1][j]+s[j]-s[i-1])
// 答案 ans = f[1][n]
int a[N],s[N],n;
LL f[N][N];
int main()
{
cin>>n;
memset(f,0x3f,sizeof f);
F(i,1,n)
{
cin>>a[i];
s[i] = s[i-1]+a[i];
f[i][i] = 0;
}
F(len,2,n)
for(int i = 1;i+len-1<=n;i++)
{
int j = i+len-1;
for(int k = i;k<j;k++)
f[i][j] = min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
}
cout << f[1][n] << '\n';
return 0;
}