AcWing 479. 加分二叉树
原题链接
中等
作者:
sy123
,
2021-03-06 23:40:14
,
所有人可见
,
阅读 340
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 30;
int n;
int w[N];
int f[N][N], g[N][N];
void dfs2(int l, int r)
{
if (l > r) return;
int k = g[l][r];
cout << k << ' ';
dfs2(l, k - 1);//递归处理左半边
dfs2(k + 1, r);//递归处理右半边
}
int dfs1(int l,int r){
int& v=f[l][r];
if(v)return v;
if(l>r)return 1;
if(l==r){//叶节点
g[l][r]=r;
return w[l];
}
for(int k=l;k<=r;k++){
int t=dfs1(l,k-1)*dfs1(k+1,r)+w[k];
if(t>v){
v=t;
g[l][r]=k;
}
}
return v;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> w[i];
dfs1(1, n);
cout << f[1][n] << endl;
dfs2(1, n);
return 0;
}