Luogu P3195玩具裝箱(斜率優化DP)

2022-05-01 01:27:12 字數 1315 閱讀 5786

這題還是比較炫的

題目鏈結

我們設f[i]是已經裝了前i個玩具,且第i個玩具是某箱子裡裝的最後乙個東西(廢話)

那我們很輕鬆可以想到乙個轉移方程

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

for(int j=0;jj)

f[i]=min(f[i],f[j]+squa(sum[i]-sum[j]+i-j-1-l)

其中sum是玩具長度的字首和,squa是平方。

但是o(50000*50000)瞬間**

我們設f[i]是由f[j]轉移過來的,j是最優轉移,同時還有乙個不那麼優的轉移k

那肯定有\(f[j]+squa(sum[i]-sum[j]+i-j-1-l)我們設\(m=sum[i]-1-l,t[j]=sum[j]+j\)

容易發現m只和i有關,t只和j有關

然後\(f[j]+squa(m-t[j])兩邊平方和展開劃一劃得到

\(((f[j]+squa(t[j]))-(f[k]+squa(t[k])))/(2*(t[j]-t[k]))>m\)

注意到f,t,m都是單調的

於是可以單調佇列斜率優化

為什麼是斜率優化呢?因為左面那個大於m的東西看著像斜率啊

附上乙個講斜率優化的部落格

yybyyb

**

#include#include

#include

#include

#include

#include

using

namespace

std;

inline

long

long

read()

while

(isdigit(ch))

return num*f;

}long

long f[1000200

];long

long m[1000200

];long

long t[1000200

];long

long c[1000200

];int s[1000200

],h,t;

inline

long

long squa(long

long a)

inline

long

long count(int x,int y)

intmain()

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

printf(

"%lld

",f[n]);

return0;

}

luogu P3195 玩具裝箱 斜率優化題解

題意簡述 現有n 個物品,第 i個物品的長度為ci 可以製造若干個容器,容器的數量和長度不限制,但是只能把連續若干個物品放入容器中。把物品區間 i,j 放入同乙個容器中,長度為 每乙個容器的製造代價為,l 為給定常數。求最小代價之和。資料範圍 對於100 的資料,原題鏈結 如果只要部分分,那麼容易設...

洛谷3195玩具裝箱(斜率優化)

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

P3195 HNOI2008 玩具裝箱TOY

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