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

加分二叉树题解

(题面见此)

思想:dfs

0、准备知识

0、二叉树中序遍历

​ Z(树)=根,Z(左子树),Z(右子树){递归定义}

1、深度优先搜索

​ 我们优先考虑“某种情况有多少种可能性”,而非“有多少种情况”。在本题中,我们先考虑“若以x为根节点,它的加分是多少”

1、程序
#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;
}
posted @ 2019-05-24 11:45  tangjikele_hlf  阅读(136)  评论(0)    收藏  举报