$ Dpが[i]は$ $ I $の記事は、最小のコストで終わる表現しました
$ DP [i]は=分(DP [J] +(J - I + \和c_k - L)^ 2)$
スロープの最適化]をクリックします。
#include <ビット/ STDC ++ H> に#define LL長い長い 使用して 名前空間STDを、 CONST INT N = 5E4 + 7 。 LL和[N]、L、C [N]、DP [N]。 INT QUE [N]、N。 テンプレート < クラス T> インラインT SQR(T A){ 戻り * 。 } インラインLL X(INT I){ 戻り和[I]。 } Y(LLインラインINT I){ 戻り DP [I] + SQR(和[I])+ 2 * L * 和[I]。 } インライン二重 K(INT I、INT J){ リターン 1.0 *(Y(I) - Y(J))/(X(I) - X(J))。 } int型のmain(){ scanf関数(" %D%LLD "、&N、&L)。 以下のために(INT iが= 1 ; I <= N; I ++ ) のscanf(" %のLLD "、&C [i])と、和[I] =和[I - 1 ] + C [i]は、 以下のために(INT iが= 1 ; I <= N; I ++ ) 和[I] + = I。 int型のヘッド= 1、尾= 1 。 L ++ ; 以下のために(INT iが= 1 ; I <= N; I ++ ){ 一方(ヘッド<尾&& K(QUE [頭部]、QUE [ヘッド+ 1 ])< 2 *和[i])とヘッド++ 。 int型 J = queの[ヘッド]。 DP [I] = DP [J] + SQR(和[I] -和[J] - L)。 一方 - (頭<尾&& K(QUE [テール1 tail-- K(QUE [尾]、I)、QUE [尾])]>) 。 QUE [ ++尾] = I; } のprintf(" %のLLD \ n "、DP [N])。 リターン 0 ; }