APIO 2014 序列分割

2022-05-04 23:33:09 字數 1066 閱讀 5189

[題目鏈結]

[演算法]

首先 , 我們發現將一段序列切成若干段所獲得的收益與順序無關

於是我們可以用fi,j表示切i次 , 前j個數的最大收益

令sumi表示ai的字首和

顯然 , fi,j = max

斜率優化即可

此題記憶體限制較緊 , 可以使用滾動陣列優化空間複雜度

時間複雜度 : o(nk)

[**]

#includeusing

namespace

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 次 選擇乙個有超過乙個元素的塊 初始時你只有一塊,即整個序列 選擇兩個相鄰元素把這個塊從中間分開,得到兩個非空的塊。每次操作後你將獲得那兩個新產生...