AcWing 282. 石子合并
原题链接
简单
作者:
邓汪涛
,
2021-07-17 21:58:40
,
所有人可见
,
阅读 202
#include <bits/stdc++.h>
using namespace std;
const int maxn = 305;
int a[maxn];
int f[maxn][maxn];
int main()
{
int n;
cin >> n;
memset(f,0x3f,sizeof f);
for(int i=1;i<=n;++i)
{
cin >> a[i];
f[i][i] = 0; //合并自身代价为0
a[i] += a[i-1];
}
f[0][0] = 0;
//DP的两种方式
// for(int len=1;len<=n;++len) //枚举长度
// {
// for(int i=1;i<=n;++i) //枚举起点
// {
// int j = i + len;
// if(j > n) break;
// for(int k=i;k+1<=j;++k) //枚举断点
// f[i][j] = min(f[i][j],f[i][k]+f[k+1][j]+a[j]-a[i-1]);
// }
// }
for(int i=n;i>=1;--i) //从后往前枚举 起点
{
for(int j = i+1;j<=n;++j) //枚举终点
{
for(int k = i;k+1<=j;++k) //枚举断点
{
f[i][j] = min(f[i][j],f[i][k]+f[k+1][j]+a[j]-a[i-1]);
}
}
}
printf("%d\n",f[1][n]);
return 0;
}