Я пытаюсь решить проблему из SPOJ ( ссылка ), который можно кратко описать так: учитывая n интервалов, каждый с целым числом начала и конца, и учитывая максимальное время окончания (назовем его max_end ), найдите, сколькими способами вы можете выбрать набор интервалов, который покрывает 1...макс_конец. Интервалы могут пересекаться. Я попробовал DP; сначала отсортируйте по времени окончания, затем dp[i] — это пара, где dp[i].first — это минимальное количество интервалов, необходимых для покрытия 1...end[i] последний с использованием интервала i а dp[ i ].second — количество способов сделать это. Вот мой основной цикл 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;
}
}
}
К сожалению, это не сработало. Может кто-нибудь, пожалуйста, скажите мне, где у меня ошибка? Заранее спасибо! :)