树上dfs
加分二叉树 https://www.luogu.org/problem/P1040
总结:
1.学会了树上搜索的一些结构(判断叶节点...)
2.递归前序输出
#include<bits/stdc++.h>
using namespace std;
int root[35][35], a[35], dp[35][35];
int n;
long ans, res;
int dfs(int l, int r)
{
if(l > r) return 1;
if(dp[l][r] != -1) return dp[l][r];
if(l == r)
{
root[l][r] = l;
dp[l][r] = a[l];
return dp[l][r];
}
int sum = 0;
for(int i = l; i < r; i++)
{
res = dfs(l, i-1)*dfs(i+1, r) + a[i];
if(res > sum)
{
sum = res;
root[l][r] = i;
}
}
dp[l][r] = sum;
return dp[l][r];
}
void print(int l, int r)
{
if(l > r) return;
cout << root[l][r] << " ";
print(l, root[l][r] - 1);
print(root[l][r] + 1, r);
}
int main()
{
memset(dp, -1, sizeof(dp));
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
ans = dfs(1, n);
cout << ans << endl;
print(1, n);
return 0;
}

浙公网安备 33010602011771号