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

浙公网安备 33010602011771号