Nn se proporciona un árbol binario de nodos en orden previo como (1,2,3, ..., n1,2,3, ..., n), donde el número 1,2,3, ..., n1,2,3, ... , n es un número de nodo. Cada nodo tiene una puntuación (ambos números enteros positivos), referido a la segunda fracción nodo II es di, treedi, árbol y cada uno de su subárbol tiene una ventaja, cualquier subtreesubtree subárbol (en sí misma comprende también treetree) el bono se calcula de la siguiente manera:
Del subárbol izquierdo subtreesubtree parcial × subtreesubtree subárbol derecho de la raíz puntos + fracción de subtreesubtree.
Si un sub-árbol está vacío, lo dispuesto en los que se dividen en 11 puntos, además de hojas resultados extra es el nodo hoja en sí. Independientemente de su árbol vacío.
Determinar un orden previo se ajusta a (1,2,3, ..., n1,2,3, ..., n) y los más altos puntos de la treetree árbol binario. Producto previsto;
(1) treetree puntos más altos
(2) treetree un preorder traversal
Formato de entrada
Línea 11: 11 número entero n (n <30) n (n <30), es el número de nodos.
Línea 22: números enteros nn separados por espacios, cada nodo como una fracción (fracción <100 <100).
Formato de salida
Línea 11: 11 números enteros, los puntos más altos (Resp \ le 4,000,000,000≤4,000,000,000).
Línea 22: nn números enteros separados por espacios, para la preventa de recorrido del árbol.
entrada y salida de la muestra
Entrada # 1 copia
5 5 7 1 2 10
Salida # 1 copia
145 3 1 2 4 5
ideas:
- Las raíces quedan con el fin de recorrer el subárbol izquierdo, subárbol derecho es correcta
- En sub-árbol en la secuencia de orden transversal, siendo como una raíz, subárbol izquierdo es la izquierda, la derecha es subárbol derecho
- Los puntos máximos de un árbol binario sub-árbol binario es también el más grande, más puntos
- Por lo tanto, puede ser considerado como el intervalo de DP, y dibujar fórmula recursiva: dp [i] [j] = max (dp [i] [j], dp [i] [m-1] * dp [m + 1] [j] + dp [m] [m]); dp [i] [j] representa la secuencia de máximo de puntos i ~ j pueden formar un árbol binario, m es una raíz número de enumeración, la gama de i ~ j
#include<iostream>
#include<algorithm>
using namespace std;
int n,mid[32][32]={0},dp[32][32];
void first(int x,int y){ //先序遍历区间X~Y,并输出序列
if(x==y){
cout<<" "<<x;
return;
}
if(y<x)return ;
cout<<" "<<mid[x][y];
first(x,mid[x][y]-1);
first(mid[x][y]+1,y);
}
int main() {
cin>>n;
for(int i=0; i<=n; i++)
fill(dp[i],dp[i]+n+2,1);
for(int i=1; i<=n; i++)
cin>>dp[i][i],mid[i][i]=i;
for(int k=1; k<n; k++) { //枚举区间大小 ,k表示间隔大小
for(int i=1,j=i+k; j<=n; i++,j++) { //枚举区间起始和终点
for(int m=i; m<=j; m++) { //枚举树根
int t=dp[i][m-1]*dp[m+1][j]+dp[m][m]; //递推式
if(dp[i][j]<t){
dp[i][j]=t;
mid[i][j]=m; //存储树根
}
}
}
}cout<<dp[1][n]<<endl; //区间i到n的最大加分二叉树大小
cout<<mid[1][n];//输出区间1~n的树根
first(1,mid[1][n]-1); //输出区间1~n-1的所有树根
first(mid[1][n]+1,n);
return 0;
}