Б - Лоуренс HDU - 2829 не записывает дп перехода уравнение наклона дп

B - Лоуренс

 HDU - 2829 

Тему я считаю, трудно, трудно дп не писать в этом уравнении.

Читать онлайн решение проблемы, я прочитал много времени, чтобы понять это переходное уравнение дп

DP [I] [J] указывает, что 1 ~ J J битов и конец с минимальным весом в секции и я

Затем определить массив W [а, Ь] является Весом до Ь и, отметим, что это не является префиксом, но вид и вес субъекта

Является ли такое б 4 5 1 2 Его стратегическое значение равно 4 * 5 + 4 * 1 + 4 * 2 + 5 * 1 + 5 * 2 + 1 * 2 = 49. 

ж [а, Ь] = 49

Затем определяют Val [я] == ш [1, я] означает, что префикс веса и вал [I] = значение [I-1] + сумма [I-1] * а [я]

Поскольку это ж [а, Ь] быть введены не непосредственно, а может быть выдвинут с помощью префикса.

求 ш [а + 1, Ь] = значение [Ь] -Val [а] - (сумма [Ь] -сумма [а]) * сумма [а]

Тогда уравнение дп можно запустить

дп [I, J] = мин (Dp [I-1, K] + W [K + 1, J])

Но прямое насилие п ^ 3, безусловно, не закончена, она должна быть оптимизирована, и эта формула не протолкнул до наклона уравнения оптимизации, как.

Если дп [I-1, к] к Кроме того, существует также значение, как правило, могут быть оптимизированы путем оптимизации наклона Dp.

И тогда он может быть введен как раньше формулы (перед ссылкой на D - Pearls HDU - 1300 двудольный наклон дп +   наклон DP - - печатающую статья Эта статья была HDU - 3507 )

令 F [ч] = дп [I-1] [ч] -Val [Н] + сумма [ч] * сумма [ч]

所以 С [H, K] = (Р [ч] -F [к) / (сумма [ч] -сумма [к]) <сумма [J]

Тогда же выводится

Если есть I> J> к G [I, J]> G [J, K]

1 О [I, J]> Gj, к]> [т] K J отличное, чем сумма, предпочтительное соотношение J я

2 G [I, J]> сумма [т]> G [J, K] J меньше, чем я тогда предпочтительно, чтобы отношение й к предпочтительно

3 сумма [т]> О [I, J]> G [J, K] я, чем отношение K J J отлично отлично

Если г> J> к G [I, J] <G [J, K]

1 О [I, J] <G [J, K] <сумма [т] J отношение K I меньше J отлично отлично

2. G [I, J] <сумма [т] <G [J, K] я, чем отношение K J J отлично отлично

3 сумма [т] <G [I, J] <G [J, K] J отношение I J K из отлично отлично

При таких обстоятельствах, J, конечно, должны быть исключены, так что, если я вставляется с задней стороны, когда передняя и J, если оно составляет менее чем наклон числа наклона и количества предыдущей конфигурации,

Ну, это, конечно, не к.

Поскольку эта сумма монотонна и префикс, можно оптимизировать очередь монотонную дп.

 

   

  

# include <cstdio> 
#include <CString> 
#include <cstdlib> 
#include <алгоритм> 
#include <очереди> 
#include <вектор> 
#include <iostream> 
#include < строка >
 #define инф 0x3f3f3f3f
 #define inf64 0x3f3f3f3f3f3f3f3f
 с использованием  пространства имен станд;
Const  INT maxn = 1e5 + 10 ; 
ЬурейеЕ долго  долго LL; 
LL дп [ 1100 ] [ 1100 ], сумма [ 1100 ], Val [ 1100], А [ 1100 ];
INT дие [maxn]; 

LL до ( INT I, INT J, INT к) 
{ 
    возвращение дп [я - 1 ] [J] - VAL [J] + сумма [J] * сумма [J] - (дп [я - 1 ] [K] - Val [K] + сумма [к] * сумма [к]); 
} 

Будем вниз ( Int J, INT к) 
{ 
    возврата суммы [J] - сумма [K]; 
} 

LL DP ( INT я, INT J, INT к) 
{ 
    возвращение дп [я - 1 ] [K] + Val [J] - Val [к] - (сумма [J] - сумма [K]) * сумма [к ];
}

INT основных () 
{ 
    INT п, м;
    в то время как (Scanf ( " % D% D " , & п, & м) && (п + т)) { 
        сумма [ 0 ] = 0 ; 
        Вал [ 0 ] = 0 ;
        для ( INT I = 1 ; г <= п; я ++ ) { 
            Scanf ( " % LLD " , & [I]); 
            сумма [I] = сумма [я - 1 ] + A [I]; 
            Val [I] = значение [г - 1 ] + сумма [я - 1] * A [I]; 
        } 
        для ( INT I = 1. , I <= п; I ++) DP [ 1. ] [I] = Val [I]; // обратите внимание , что эта тема инициализации 
        для ( INT I = 2 ; я <= т + . 1 ; я ++ ) {
             INT головы = 0 , хвост = 0 ; // Замечание дп [I, J] конец определения является J в минимальное значение величины блоков 
            дие [хвост ++] = я - 1. ; / / потому что следующий сегмент должны быть разделен на я блоки, число перед мере учитываться I-1, а также может сопровождаться другим в целом, не пропуская примечание случая 
            для ( INT J = I, J <= n-; J ++ ) { // Обратите внимание , что это должно быть видно J я начинаю
                в то время как (голова + 1 <&& хвост вверх (я, дие [головка + 1 ], дие [голова]) <= сумма [J] * вниз (дие [головка + 1 ], дие [голова])) головы ++ ; 
                дп [I] [J] = DP (I, J, Que [голова]);
                в то время как (голова + 1 <хвост && вверх (I, J, Que [хвост - 1 ]) * вниз (дие [хвост - 1 ], дие [хвост - 2 ]) <= до (I, дие [хвост - 1 ], дие [хвост - 2 ]) * вниз (J, дие [хвост - 1 ])) tail-- ; 
                дие [хвост ++] = J; 
            } 
        } 
        Е (" % LLD \ п " , дп [М + 1 ] [N]); 
    } 
    Возвращает  0 ; 
}

 

рекомендация

отwww.cnblogs.com/EchoZQN/p/11402172.html
рекомендация