Estoy tratando de resolver un problema de SPOJ (link), que se puede describir brevemente así: Dado n intervalos, cada uno con un entero de principio y fin, y dado el final con tiempo máximo (vamos a llamarlo max_end), encuentre de cuántas maneras puede elegir un conjunto de intervalos que cubra 1 ... max_end. Los intervalos pueden superponerse. Intenté un DP; primero ordenar por hora de finalización, luego dp [i] es un par, donde dp [i] .primero es el número mínimo de intervalos necesarios para cubrir 1 ... fin [i] último uso del intervalo i y dp [i] .segundo es el número de formas de hacerlo. Aquí está mi bucle DP principal:Ayuda en un problema de DP
for(int i = 1; i < n; i ++) {
for(int j = 0; j < i; j ++) {
if(! (x[ j ].end >= x[ i ].start - 1))
continue;
if(dp[ j ].first + 1 < dp[ i ].first) {
dp[ i ].first = dp[ j ].first + 1;
dp[ i ].second = dp[ j ].second;
}
else if(dp[ j ].first + 1 == dp[ i ].first) {
dp[ i ].second += dp[ j ].second;
}
}
}
Lamentablemente, no funcionó. ¿Alguien puede decirme dónde tengo un error? ¡Gracias por adelantado! :)
¿Cuáles son sus valores iniciales para dp [0]? Además, la pregunta vinculada específicamente solicita la cantidad de intervalos ** mínimos ** de intervalos que cubren un día en particular; ¿Estás seguro de que este algoritmo garantiza eso? – templatetypedef
Hola, inicializo dp [0] .first = dp [0] .second = 1 si start [0] = 1. Y creo que mi algoritmo no garantiza eso. Si tienes alguna solución en mente, te agradecería :) – Chris
¿Puedes explicar tu intuición aquí? No puedo entender por qué funciona tu código. – templatetypedef