加分二叉树 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; }