發現答案最終形如xy+yz+xz,與順序無關
斜率優化dp顯然
坑點是當分母為0時不可以把斜率當成inf,要當成-inf,即直接約分會錯
艹因為這個坑小破題調了一下午……
強行深入理解斜率優化(大霧
#include#includeusing
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 觀察這個式...