¿Se puede resolver Codeforces 431C – k-tree por recusión?

Es un problema de programación dinámica y la recursividad con la memorización es la forma más fácil de resolver ese problema.

Cosas a tener en cuenta:

  1. forma de alcanzar un camino ponderado con un borde de peso al menos d .
  2. Tiene un conjunto continuo de aristas hasta K en cada nodo.
  3. peso requerido N

formato de memo dp [peso actual] [First_Condition_Truth]

First_Condition_Truth: cero para la primera condición falsa y viceversa.

Función (Current_Weight_Of_Path, First_Condition_Truth)

Caso base: ha tomado al menos un borde de peso do mayor y ha alcanzado el peso deseado, establezca dp [Current_Weight_Of_Path] [First_Condition_Truth] igual a 1 y regrese.

De lo contrario: almacene la suma de funciones después de tomar cada borde de 1 a k hasta que la adición al peso sea menor que el peso requerido (N), y si el borde tomado es mayor que igual a d establezca First_Condition_Truth en 1 y luego vuelva a aparecer. Almacene y devuelva esta suma.

ll resolver (ll cur_w, ll estado) {
if (dp [cur_w] [estado]! = – 1)
return dp [cur_w] [estado];
si no (cur_w> n)
dp [cur_w] [estado] = 0;
si no (cur_w == n && state)
dp [cur_w] [estado] = 1;
más {
ll ret = 0;
para (ll i = 1; i <= k; i ++)
if (cur_w + i = d)? 1: 0)), ret% = MOD;
dp [cur_w] [estado] = ret;
}
return dp [cur_w] [estado];

}

/ **** El comienzo de la recursión y el resultado final: se pondrá en Main () ** /
para (int i = 1; i <= k; i ++) {
ret + = resolver (i, (i> = d)? 1: 0);
ret% = MOD;
}