Noip2003提高组——加分二叉树题解

#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;
}

猜你喜欢

转载自www.cnblogs.com/NestwithStar/p/jia_fen_er_cha_shu.html