Luo Valle P1352 ningún partido jefe (DP + árbol de la memoria)

título Descripción

Hay una universidad nn los n-personal, numeradas 1 ... N1 \ ldots el n- 1 ... el n-.

Hay dependencias entre ellos, que es su relación directa supervisor es como un árbol arraigado al principal, el nodo padre es el nodo hijo.

Ahora no es el banquete de aniversario, invitó a un banquete a todos los empleados aumentará un cierto índice de felicidad rir_i r i , pero entonces, si el supervisor directo de un miembro del personal para asistir a la fiesta de graduación, entonces el personal, en cualquier caso se han negado a participar partido de danza.

Por lo tanto, ha programado la informática, que permite al personal de invitar al mayor índice de felicidad, encontrar el mayor índice de felicidad.

Formato de entrada

La primera línea de la entrada es un número entero NN n-.

De 22 es 2 a (n- +. 1) (n- +. 1) ( n- + 1. ) Líneas, cada uno un entero, la (I. + 1) (I +. 1) ( I + . 1 un número entero) línea representa II I No. índice de felicidad de los empleados rir_i r i .

De (n- + 2) (n- + 2) ( n- + 2 ) a la segunda (2N +. 1) (2N +. 1) ( 2 n- + . 1 líneas), cada par de entero de entrada L, kl a, K L , K representante KK K es ll supervisor directo de l.

Formato de salida

Una línea de salida número entero representa el mayor índice de felicidad.

entrada y salida de la muestra

Entrada # 1
7 
1 
1 
1 
1 
1 
1 
1 
1 3 
2 3 
6 4 
7 4 
4 5 
3 5 
0 0
Salida # 1
5 
árbol DP ejemplo clásico. Para algunas raíces para no más de dos casos: el voto raíces raíz de las elecciones y no. En dp [i] [0] i representa la persona seleccionada, dp [i] [1] indica que la persona no se selecciona entre i. Si se selecciona, a continuación, dp [i] [0] para añadir su propio índice de felicidad cansado, luego barrer esto bajo la recursivo persona subordinada (Nota de la memoria), dice que el título no es un supervisor directo si es posible. dp [i] [1] en el resultado de la acumulación para cada i obtenido en la recursión de la persona, y finalmente devuelve el valor más grande que.
#include <bits / STDC ++ H.>
 #define N 6005 
 el uso de  espacio de nombres STD;
 int A [N], cabeza [N], Ver [N], la Siguiente [N], TOT = 0 , n-;
 int DP [N] [ 2 ] = { 0 }; // DP [i] [0] representa un grupo seleccionado bajo i en lugar de i se selecciona de dp [i] [1] representa un grupo seleccionado subordinado no seleccionado de i i 
BOOL VIS [ 6005 ] = { 0 } ;
 void el Add ( int X, int Y) 
{ 
    Ver [ ++ TOT] = Y; 
    la Siguiente [TOT] = cabeza [X]; 
    cabeza [X] = TOT; 
} 
int Proceso ( intr) 
{ 
    si (dp [r] [ 0 ] || dp [r] [ 1 ]) 
    { 
        volver max (dp [r] [ 0 ], dp [r] [ 1 ]); 
    } 
    Int i, j; 
    dp [r] [ 0 ] + = una [r];
    para (i = cabeza [r]; i; i = Siguiente [i]) 
    { 
        int y = Ver [i]; 
        dp [r] [ 1 ] + = proceso (y); 
    } 
    Para (i = cabeza [r]; i; i = Siguiente [i]) 
    { 
        int y = Ver [i];
        para (j = cabeza [y]; j; j = Siguiente [j]) 
        {
            int z = Ver [j]; 
            dp [r] [ 0 ] + = proceso (z); 
        } 
    } 
    Volver max (dp [r] [ 0 ], dp [r] [ 1 ]); 
} 
Int main () 
{ 
    int i; 
    cin >> n;
    para (i = 1 ; i <= n; i ++) scanf ( " % d " , & a [i]);
    para (i = 1 ; i <= n- 1 ; i ++ ) 
    { 
        int x, y; 
        scanf ( " % d% d " , & x, yy);
        si (x && y) 
        { 
            add (y, x); 
            vis [x] = 1 ; 
        } 
    } 
    Int raíz;
    para (i = 1 ; i <= n; i ++ ) 
    { 
        si (vis [i]!) // 寻找树根
        { 
            root = i;
            romper ; 
        } 
    } 
    Cout << proceso (raíz); 
    volver  0 ; 
}

 

Supongo que te gusta

Origin www.cnblogs.com/lipoicyclic/p/12541297.html
Recomendado
Clasificación