BZOJ 3675 序列分割

2022-05-13 10:45:22 字數 884 閱讀 3295

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\$

可以發現這個式子明顯是可以斜率優化的,且能用滾動陣列,直接上就行了

tip:

1、此題卡空間,不用滾動陣列會$mle$

2、可能出現$sum[j]=sum[k]$的情況,要特判(改除法為乘法也行)

#include using

namespace

std;

typedef

long

long

ll;const

int maxn=1e5+10

;ll inf=1e18,sum[maxn],dp[2

][maxn];

int pre[205][maxn],q[maxn],n,k,x,l,r,cur=0;

inline

double slope(int k,intj)

intmain()

}printf(

"%lld

",dp[cur^1

][n]);

return0;

}

1、斜率優化中要注意除數是否可能為0

2、感覺不少這樣一邊操作一邊算貢獻的題目最後都和中間操作無關

多考慮一下,用分配率什麼的推一推看是否只和最終態有關

3、為了轉化成符合$dp$的模型

將 兩兩間的操作 改成 乙個數與之前數(之和)的操作

bzoj3675 序列分割

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

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

傳送門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 ...

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

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