B - Лоуренс
Тему я считаю, трудно, трудно дп не писать в этом уравнении.
Читать онлайн решение проблемы, я прочитал много времени, чтобы понять это переходное уравнение дп
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 ; }