APIO2014 序列分割 題解

2022-05-05 12:30:12 字數 877 閱讀 5300

發現答案最終形如xy+yz+xz,與順序無關

斜率優化dp顯然

坑點是當分母為0時不可以把斜率當成inf,要當成-inf,即直接約分會錯

艹因為這個坑小破題調了一下午……

強行深入理解斜率優化(大霧

#include#include

using

namespace

std;

const

int maxn = 100005

;const

int maxm = 205

;int

n, m, pre[maxm][maxn], q[maxn];

long

long

ints[maxn], dp[maxm][maxn];

void do_it(int

x)

if(ll <=rr)

y=q[rr-1]; z=q[rr];

while(ll < rr &&((((dp[x-1][y]-s[y]*s[y]) - (dp[x-1][z]-s[z]*s[z]) )*(s[i]-s[z])

> ((dp[x-1][z]-s[z]*s[z]) - (dp[x-1][i]-s[i]*s[i]) ) *(s[z]-s[y])

&& s[z] != s[y]) || s[i] ==s[z])

) rr++;

q[rr]=i;

}return;}

intmain()

for(i=2; i <= m; i++) do_it(i);//

coutt=n;

for(i=m; i >= 2; i--)

cout

}

APIO 2014 序列分割

題目鏈結 演算法 首先 我們發現將一段序列切成若干段所獲得的收益與順序無關 於是我們可以用fi,j表示切i次 前j個數的最大收益 令sumi表示ai的字首和 顯然 fi,j max 斜率優化即可 此題記憶體限制較緊 可以使用滾動陣列優化空間複雜度 時間複雜度 o nk includeusing na...

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 觀察這個式...