AcWing 282. 石子合并
原题链接
简单
作者:
ye_che
,
2021-05-31 19:34:19
,
所有人可见
,
阅读 198
变量含义
qs 起始位置
bc 步长
hf 划分位置
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 400;
int f[N][N], num[N], s[N], n;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++) cin >> num[i], s[i] = s[i-1] + num[i];
for(int bc = 1; bc <= n; bc ++)
for(int qs = 1; qs <= n - bc; qs ++)
for(int hf = qs; hf <= qs + bc - 1; hf ++)
if(!f[qs][qs+bc])
f[qs][qs+bc] = f[qs+bc][qs] = f[qs][hf] + f[hf+1][qs+bc] + s[qs+bc] - s[qs-1];
else
f[qs][qs+bc] = f[qs+bc][qs] = min(f[qs][qs+bc], f[qs][hf] + f[hf+1][qs+bc] + s[qs+bc] - s[qs-1]);
cout << f[1][n];
}