Detalles temas
Tema Análisis: La solución es la memoria de la búsqueda.
Val [i] [j] i se almacena en los puntos más altos en el intervalo j.
árbol [33] De acuerdo con el significado de las preguntas disponibles, array árbol se almacena árbol secuencia de orden previo.
la raíz [i] [j] se almacena óptima array raíz del árbol de i a j, es decir, con el fin de asegurar que este subárbol con raíces en los puntos más altos.
Se entiende por propiedades recorrido en orden: si x es un nodo raíz, 1 ~ x - 1 es un subárbol izquierdo, x + 1 ~ n del subárbol derecho.
código:
#include <cstdio>
unsigned int n, val[33][33], tree[33], root[33][33];//数据范围小于4,000,000,000
unsigned int dfs(int l, int r){
if (r < l) return 1;//没有子树,返回一
if (l == r){//刚好是叶子
root[l][r] = l;
return tree[l];
}
if (val[l][r]) return val[l][r];//记忆化,若搜索过直接返回
for (int i = l; i <= r; i++){
unsigned int sum = dfs(l, i - 1) * dfs(i + 1, r) + tree[i];//求加分
if (sum > val[l][r]) val[l][r] = sum, root[l][r] = i;//更新,使val[i][j]保持最高加分。
}
return val[l][r];//返回最高加分。
}
void preOrder(int l, int r){//输出前序遍历。
if (l > r)//没有子树直接返回。
return;
printf("%d ", root[l][r]);
preOrder(l, root[l][r] - 1);
preOrder(root[l][r] + 1, r);
}
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &tree[i]);//按顺序输入中序遍历。
printf("%u\n", dfs(1, n));
preOrder(1, n);
}