HNOI2008 玩具裝箱TOY

2022-05-25 12:48:13 字數 1119 閱讀 5141

洛谷題目鏈結

動態規劃$+$單調佇列$+$斜率優化

身為$dp$蒟蒻的我,準備學斜率優化和單調佇列,自然不能放過這個經典題目了,我們對於這題很容易想出乙個暴力式子:

($sum[i]$為字首和)

$f[i]=min(f[i],f[j]+(sum[i]-sum[j]+i-j-l-1)^2)$

我們不考慮最小值,把$sum[i]+i$用$a[i]$代替,$sum[j]+j+l+1$用$b[j]$代替,那麼式子整理一下如下:

$f[i]=f[j]+(a[i]+b[j])^2$

去括號:

$f[i]=f[j]+a[i]^2+2a[i]b[j]+b[j]^2$

移項:$f[j]+b[j]^2=2a[i]b[j]+f[i]+a[i]^2$

設$y=f[j]+b[j]^2$,$x=b[j]$,$b=f[i]+a[i]^2$,這就很像一次函式了,那麼斜率自然就是$k=2a[i]$了

為什麼這麼設呢,因為我們發現$y,x,k$在知道$i,j$時可以快速求出

$f[i]$的含義轉化為:當上述直線過點$p(b[j],f[j]+b[j]^2)$時,直線在$y$軸的截距加上$a[i]^2$(乙個定值)

而題目即為找這個截距的最小值

而且我們仔細一看發現會有單調性,於是用單調佇列維護最小值。

**如下:

// luogu-judger-enable-o2

#include#include#define n 50007

#define int long long

using namespace std;

int n,l;

int sum[n],que[n],f[n];

int a(int i)

int b(int i)

int x(int i)

int y(int i)

int get_k(int i,int j)

signed main()

int head=1,tail=1;

for(int i=1;i<=n;++i)

printf("%lld",f[n]);

return 0;

}

HNOI2008 玩具裝箱toy

重點在講斜率優化 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1.n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一...

HNOI2008 玩具裝箱toy

dp i min dp j sum i sum j c 2 dp k sum i sum k c 2 dp k si sum k 2 dp k si 2 2 si sum k sum k 2 dp k sum k 2 dp j sum j 2 2 si sum k sum j yk yj 2 si ...

HNOI2008 玩具裝箱TOY

題目描述 p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1 n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時...