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