[Luogu] P1040 plus binario

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);
}
Publicado 18 artículos originales · ganado elogios 0 · Vistas 396

Supongo que te gusta

Origin blog.csdn.net/weixin_45646006/article/details/105170902
Recomendado
Clasificación