[題目鏈結]
[演算法]
首先 , 我們發現將一段序列切成若干段所獲得的收益與順序無關
於是我們可以用fi,j表示切i次 , 前j個數的最大收益
令sumi表示ai的字首和
顯然 , fi,j = max
斜率優化即可
此題記憶體限制較緊 , 可以使用滾動陣列優化空間複雜度
時間複雜度 : o(nk)
[**]
#includeusingnamespace
std;
#define maxn 100010
#define maxk 210typedef
long
long
ll;typedef
long
double
ld;typedef unsigned
long
long
ull;
intn , k , l , r;
ll x[maxn] , y[maxn] , sum[maxn] , f[
2][maxn];
inta[maxn] , q[maxn] , last[maxk][maxn];
template
inline void chkmax(t &x,t y)
template
inline void chkmin(t &x,t y)
template
inline void read(t &x)
intmain()
for (int i = 1; i <= k; i++)
}printf(
"%lld\n
" , f[k & 1
][n]);
int now = n , s =k;
vector
< int >ans;
while (now > 0
)
reverse(ans.begin() , ans.end());
//輸出方案...
return0;
}
APIO2014 序列分割
將乙個長度為 n 的序列分成 k 段,每次分割一段長度 ge 2 的序列,得分為兩邊序列元素和的乘積,求最大得分 2 leq n leq100000,1 leq k leq min 0 a i 10 4 我們發現一對元素 i,j 產生貢獻 a i a j 的條件是分割後元素不在同一段裡 於是我們知道...
APIO2014 序列分割
嘟嘟嘟 複習一下斜率優化,感覺已經忘得差不多了 這題切入點在與答案跟切的順序無關。證明就是假如有三段權值分別為 x,y,z 那麼這兩刀不管按什麼順序切,得到的結果都是 xy xz yz 然後就可以dp。令 dp i j 表示前 i 個數切 j 刀的最大得分,於是就有 dp i j max 觀察這個式...
APIO2014 序列分割
題目鏈結 你正在玩乙個關於長度為 n 的非負整數序列的遊戲。這個遊戲中你需要把序列分成 k 1 個非空的塊。為了得到 k 1塊,你需要重複下面的操作 k 次 選擇乙個有超過乙個元素的塊 初始時你只有一塊,即整個序列 選擇兩個相鄰元素把這個塊從中間分開,得到兩個非空的塊。每次操作後你將獲得那兩個新產生...