zjoi2007倉庫建設
講乙個比較呆一點的做法:
設f[i][1]表示後i個點且i點建倉庫的最優解,f[i][0]表示後i個點且i點不建倉庫的最優解。
那麼顯然可以從後往前dp:
f[i][0]=mini;
f[i][1]=mini+c[i];
令s[j]=∑i<=
k(x[j]-x[k])*p[k]。
則s[j]=∑i<=
k(x[j]*p[k]-x[k]*p[k])=∑i<=
kx[j]*p[k]-∑i<=
kx[k]*p[k]=x[j]*∑i<=
kp[k]-∑i<=
kx[k]*p[k]。
不妨令a[x]=x[x]*p[x]。
那麼s[j]可以用字尾和表示為:s=x[j]*(sump[i]-sump[j])-(suma[i]-suma[j])。
所以f[i][0]=min 。
把式子化成一次函式可得:
f[j]-x[j]*sufp[j]+sufa[j]=-sufp[i]*x[j]+sufa[i]+f[i]
從後往前維護乙個斜率單調遞減的下凸殼即可。
需要注意的是,每次應先轉移好fi。
因為y中含有f[i],沒轉移好f[i]
會影響i入隊時去尾操作。
#include#define rg registerby bhllx#define il inline
#define db double
#define int long long
using
namespace
std;
il int
gi()
while (ch>='
0'&&ch<='
9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return w?-x:x;
}const
int n=1e6+10
;int
l,r,q[n];
int n,p[n],x[n],c[n],a[n],sufa[n],sufp[n],f[n][2
];il db y(
int x)
il db slope(
int x,int y)
signed main ()
printf(
"%lld\n
",min(f[1][1],f[1][0
]));
return0;
}
ZJOI2007 倉庫建設 斜率優化dp
大腦真是個很優秀的器官,做事情之前總會想著這太難,真的逼著自己做下去,回頭看看,其實也不過如此 很樸素的斜率優化dp了 首先要讀懂題目 我的理解能力好bug啊 然後設 dp i 表示處理完前 i 個傢伙,並且在第 i 個傢伙處建倉的答案 那麼有 dp i min p k x i x k c i 化簡...
bzoj1096 倉庫建設 斜率優化
dsy1096 zjoi2007 倉庫建設 問題描述 l公司有 n個工廠,由高到底分布在一座山上。如圖所示,工廠 1在山頂,工廠 n在山腳。由於這座山處於高原內陸地區 乾燥少雨 l公司一般把產品直接堆放在露天,以節省費用。突然有一天,l公司的總裁 l先生接到氣象部門的 被告知三天之後將有一場暴雨,於...
斜率優化 DP
我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...