Red de conocimiento informático - Computadora portátil - Programación del algoritmo C++ (Dangdang descubrió que hay dos árboles mágicos en el campus (numerados 1 y 2 respectivamente), que seguirán arrojando monedas de oro por la noche...)

Programación del algoritmo C++ (Dangdang descubrió que hay dos árboles mágicos en el campus (numerados 1 y 2 respectivamente), que seguirán arrojando monedas de oro por la noche...)

Pregunta de programación dinámica: denota a[i] como el árbol que dejó caer la moneda de oro en el i-ésimo segundo. f[i, k, w] es el número total de monedas de oro obtenidas de 1 a i segundos estando exactamente debajo del árbol k en el i-ésimo segundo y con w número de pasos de movimiento restantes.

Entonces f[i, k, w] = max{f[i-1, k, w], ?f[i-1, 3-k, w-1]} +?(a [i] == k); (En ambos casos, el último segundo estuvo debajo del mismo árbol y el último segundo estuvo debajo de otro árbol).

Condición inicial f[0, k, w] = 0 (para todo k=1 y w=1..W). El código simple es el siguiente para?(int?i?=?0;?i?<=?W;?i++)

f[0][0][i]?=?0;

p>

for?(int?i?=?0;?i?<=?W;?i++)

f[0][0][i]?= ?-100000000;

para?(int?t?=?1;?t?<=?T;?t++)

para?(int?w?=?0 ;?w? <=?W;?w++)

para?(int?k?=?0;?k?<=?1;?k++)

f[ t][k ][w]?=?max(f[t-1][k][w],?f[t-1][1-k][w-1])?+?(k? ==?a [i]?-1);

int?res?=?0;

for?(int?w?=?0;?w?<= ?W;? w++)

for?(int?k?=?0;?k?

res?=?max(res,? f[T] [k][w]);

printf("%d",?res);