筆記篇 斜率優化dp(二) SDOI2016征途

2022-07-22 05:36:14 字數 1581 閱讀 5351

=傳=送=門=

搜題目名會搜出很多奇怪的東西... 這個題目似乎有點毒?

比如在bzoj和loj上可以1a的**上會在luogu tle 2個點, 在cogs tle 10個點 但是根據已有的資料來看資料都是一樣的...毒瘤評測姬毀我oi!!!

這個題的狀態轉移方程並不是很好推的說. 出題人讓\(*m^2\)肯定是有目的的啊..

(比如不讓乘\(m^2\)我們可能會需要考慮乘\(m^2\)最後再除掉之類的)

然後就化一波式子: 我們令\(sum\)表示\(n\)段路的總和.

\[m^2s^2=m^2\frac^m(x_i-\bar x)^2}m=m\sum_^m(x_i-\bar x)^2\\=m\sum_^mx_i^2-m\sum_^m2x_i\bar x+m\sum_^m\bar x^2\\

=m\sum_^mx_i^2-(2\sum_^mx_i)*(m*\bar x)+m^2(\fracm)^2\\=m\sum_^mx_i^2-2sum^2+sum^2=m\sum_^mx_i^2-sum^2

\]而\(m\)和\(sum^2\)都是常數我們可以不管, 那就是要求最小化\(\sum_^mx_i^2\).

所以令\(f[i][j]\)表示前\(i\)天走了前\(j\)段路, \(s_i\)表示前\(i\)段路的字首和, 那就能寫出狀態轉移方程:

\[f[i][j]=min\ (k\in[1,j))

\]那很明顯這個是\(o(n^3)\)可以做的, 這樣能拿到60pts了就.

但是想a的話 很明顯要採用一種\(o(n^2)\)的演算法. 當然你要能\(o(n)\)甚至\(o(1)\)過也沒啥問題...

那我們就要搬出斜率優化了. 我們繼續化式子.

首先很明顯第一維跟後面這一堆沒啥關係, 那就不優化了, 也可以把這一維去掉, 到時候一滾動陣列(其實不滾也能過)就行了.

那狀態轉移方程就可以改寫成:

\[f[j]=min\

\]然後繼續化成y=kx+b的形式, $$f[j]=f'[k]+s_j2-2s_js_k+s_k2$$

移項得\(f'[k]+s_k^2\)

=\(2s_j\)

\(s_k+\)

\(f[j]-s_j^2\)

這樣的話我們就可以正常的斜率優化了. 最後輸出\(m*f[n][m]-sum^2\)就好啦~

不過要修一下邊界條件.

然後就是**: 並不知道究竟能不能ac 請謹慎複製!

#include #include const int n=3030;typedef long long ll;

ll s[n],q[n],n,m,h,t;ll f[n],g[n];

inline ll gn(ll a=0,char c=0)

inline double slope(ll x,ll y)

int main()::memcpy(g,f,sizeof(g));

}printf("%lld",f[n]*m-s[n]*s[n]);

}

被莫名的非主觀因素的tle卡掉好多下午的學(tui)習(fei)時間, 心情並不怎麼好...

不過下雪了出去玩了一圈就非常爽了~ (⊙v⊙)嗯

斜率優化dp筆記

瞎扯 演算法真的是無止境,從暴力到dp原本以為很神奇了,沒想到還能優化dp,而且是把o n 2 變成o n 真是無 說。引入 我們來分析這麼乙個問題,給你n個數,要你把他們分成連續的若干塊,使得讓他們的每段和的平方加起來最小.正常我們會想到的就是o n 2 的dp,方程就是 dp i min dp ...

學習筆記 斜率優化DP

作為數學渣,先複習一下已知兩點 x 1,y 1 x 2,y 2 怎麼求過兩點的一次函式的斜率.待定係數法代入 y kx b 有 x 1k b y 1 x 2k b y 2 兩式相減有 k frac 故事圍繞著 演算法競賽高階指南 的三一道例題展開 任務安排 1 假如我們啟動了乙個任務 l,r 那麼它...

斜率優化DP學習筆記

本文以luogup3195 玩具裝箱為例,我們很容易可以的出下面這個柿子 f i min 設 b i s i i j 為 f i 的最優決策點,則有 f i f j b i b j l 1 2 把只與 j 有關的放在左邊 f j b j 2 b j l 1 2 b i b j b i 2 l 1 2...