AcWing 282. 石子合并
原题链接
简单
作者:
minux
,
2020-05-03 09:38:01
,
所有人可见
,
阅读 497
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int N=305;
int n;
int s[N];
int f[N][N];
int main(){
memset(s, 0x00, sizeof s);
memset(f, 0x00, sizeof f);
cin>>n;
for(int i=1; i<=n; ++i) cin>>s[i];
for(int i=1; i<=n; ++i) s[i]+=s[i-1]; // 预处理前缀后数组
for(int len=2; len<=n; len++){ // 枚举长度
for(int i=1; i+len-1<=n; ++i){ // 枚举起点
int l=i, r=i+len-1; // 计算左右端点
f[l][r]=INF;
for(int k=l; k<r; ++k) // 合并区间
f[l][r]=min(f[l][r], f[l][k]+f[k+1][r]+s[r]-s[l-1]);
}
}
cout<<f[1][n]<<endl;
return 0;
}