傳送門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.選擇乙個位置,並通過這個位置將這...