#include <iostream> int mark[33][33],root[35][35]; using namespace std; void read (int n){ int i,j; for(i = 1; i <= n; i++ ){ for(j = 1; j <= n; j++ ){ mark[i][j] = -1; } cin >> mark[i][i]; root[i][i] = i; } return; } int dfs (int a,int b){ int ans = -1, sum; if(a > b) return 1; else if(mark[a][b] != -1) return mark[a][b]; else{ for(int i = a; i <= b; i++ ){ sum = dfs (a,i-1) * dfs (i+1,b) + mark[i][i]; if(sum > ans){ ans = sum; root[a][b] = i; } } mark[a][b] = ans; return mark[a][b]; } } void pre (int a, int b){ if(a > b) return; int i = root[a][b]; cout << i << " "; pre (a, i-1); pre (i+1, b); } int main(int argc, char** argv) { ios::sync_with_stdio(false); int n, i, j, k; cin >> n; read (n); i = dfs (1,n); cout << i << "\n"; pre (1,n); cout << endl; return 0; }
Noip2003提高组——加分二叉树题解
猜你喜欢
转载自www.cnblogs.com/NestwithStar/p/jia_fen_er_cha_shu.html
今日推荐
周排行