[テンプレート]スロープ最適化DP

トピックリンク:https://codeforces.com/problemset/problem/1083/E

私は数ドルを書きたかった、と傾きがボードを片付けるだけスロープDPをやったやった、最適化さdpにあることがわかりました。

サブサブ(下位)凸包上の斜面DP最適化凸包とほぼメンテナンスに感じ。

1  // F [J] = YI * XJ +のWi - XI * YI + Fiを、
2  // 维护上凸包、斜率递减
3の#include <ビット/ STDC ++ H>
 4  使って 名前空間STDを、
5 typedefの長い 長いLL。
6  CONST  INT N = 1E6 + 9 7  構造体ポイント{
 8      LLのX、Y、W。
9      ブール 演算子 <(constのポイント&B)のconst {
 10          リターン X < BX。
11      }
 12  } [N]。
13 LL Q [N]、F [N]。
14  二重 CAL(INT I、INT J){
 15      リターン 1.0 *(F [J] - F [I])/([J] .X - [I] .X)。
16  }
 17  int型のmain(){
 18      INT N。scanf関数(" %のD "、&N)
19      のためにINT iは= 1 ; iが<= N; ++ I)のscanf(" %LLD%LLD%LLD "、および[I] .X、&[I] .Y、および[I] .W)。
20      ソート(+ 1、+ 1 + N)。
21      INTL = 1、R = 1 22      LL ANS = - 1000000000000000 23      のためにINT iは= 1 ; iが<= N; ++ i)が{
 24          、一方(L <R && CAL(Q [L]、Q [L + 1 ])> = [I] .Y)++ L ;
25          INT J = Q [L]。
26          F [I] = F [J] - [I]・Y * [J] .X - [I] .W + [I]・X * [I] .Y。
27の          ANS = MAX(ANS、F [I])。
28          一方(L <R && CAL(Q [R- 1 ]、Q [R])<= CAL(Q [R]、I)) - R。
29          Q [++ R] =私;
30      }
 31      のprintf(" %のLLD " 、ANS)。
32 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/12239333.html