bzoj 3675 序列分割(斜率優化DP)

2021-08-13 13:55:24 字數 1026 閱讀 4851

傳送門biu~

可以發現乙個序列先切和後切獲得的得分是一樣的。 設s

umi 為初始序列的字首和,設狀態fi

,k代表在i處分割、已經分割了k次的最大得分,那麼fi

,k=(

(sum

i−su

mj)∗

sumj

+fj,

k−1)

max

考慮斜率優化。設p為f_乙個可行的值。則p=

sumi

∗sum

j−su

m2j+

fj,k

−1,設x=

sumj

,y=s

um2j

−fj,

k−1 ,那麼式子就變為了y=

sumi

∗x−p

因為斜率su

mi是定值,想讓−p

(即截距)最小,可以發現所求點在乙個下凸包上。維護下凸包即可,時間複雜度o(k*n)。

#include

#define ll long long

using

namespace

std;

struct point

}stac[100005];

int head=1,tail=1;

int n,k;

int a[100005];

ll sum[100005],f[100005][2];

inline

double get_slope(point x,point y)

void insert(point a)

stac[tail]=a;

stac[tail].slope=s;

++tail;

}point get_ans(double x)

return stac[head];

}int main()

}printf("%lld",f[n][~k&1]);

return

0;}

BZOJ 3675 序列分割

bzoj 3675 傳送門 首先要注意到結果與分割的順序無關,只與最終狀態有關 實際上 res sum a i a j 可再轉化為 res sum n a i sum i 1 令 dp i j 表示將前 j 個數分成 i 段的最大得分,dp i j max 可以發現這個式子明顯是可以斜率優化的,且能...

bzoj3675 序列分割

小h最近迷上了乙個分隔序列的遊戲。在這個遊戲裡,小h需要將乙個長度為n的非負整數序列分割成k 1個非空的子串行。為了得到k 1個子序列,小h需要重複k次以下的步驟 1.小h首先選擇乙個長度超過1的序列 一開始小h只有乙個長度為n的序列 也就是一開始得到的整個序列 2.選擇乙個位置,並通過這個位置將這...

BZOJ3675 序列分割(斜率優化,動態規劃)

小h最近迷上了乙個分隔序列的遊戲。在這個遊戲裡,小h需要將乙個長度為n的非負整數序列分割成k 1個非空的子串行。為了得到k 1個子序列,小h需要重複k次以下的步驟 1.小h首先選擇乙個長度超過1的序列 一開始小h只有乙個長度為n的序列 也就是一開始得到的整個序列 2.選擇乙個位置,並通過這個位置將這...