題目鏈結
第一道自己推的斜率優化dp><
首先要明確一點:裝進同乙個容器的toys一定要是連著的幾個(否則的話可以直接貪心)-->之前理解錯題意wa了一次......
用sum[i]表示字首和,f[i]表示前i個裝進容器的最小費用,
容易知道
f[i]=max(f[i],f[j]+(sum[i]-sum[j]+i-(j+1)-l)2)(j
令kf[k],則需要滿足:
f[j]+(sum[i]-sum[j]+i-(j+1)-l)2
2令t[i]=sum[i]+i,則移項,可得:
f[j]-f[k]+(t[j]-t[k])*(t[j]+t[k])<2(t[i]-l-1)(t[j]-t[k])
即:(f[j]-f[k]+t[j]2-t[k]2)/(t[j]-t[k])<2*(t[i]-l-1)
令g[i]=f[i]+t[i]2
,則有(g[j]-g[k])/(t[j]-t[k])<2*(t[i]-l-1)。
用s(i,j)表示i到j連線的斜率,
對於乙個單調佇列,每次對於隊首,若s(q[h],q[h+1])<2*(ti-l-1),則此時的q[h]一定不會是現在和以後的最優解,h++;
對於隊尾,若s(q[t-2],q[t-1])>s(q[t-1],i),如果s(q[t-2],q[t-1])<2*(t[i]-l-1),則s(q[t-1],i)<2*(t[i]-l-1),由i>q[t-1]可知此時i比q[t-1]要優;如果s(q[t-2],q[t-1])>2*(t[i]-l-1),則q[t-2]要比q[t-1]優。所以無論如何q[t-1]都不會是最優解,此時t--。
接著就是斜率優化dp的套路了:
1 #include2 #include3 #include4 typedef longbzoj1010long
ll;5
const
int maxn=5e4+5;6
using
namespace
std;
7ll a[maxn],q[maxn],sum[maxn],g[maxn],t[maxn],f[maxn];
8inline ll read()912
while(c>='
0'&&c<='9')
13return anss*f;14}
15 inline double
cal(ll a,ll b)
1619
intmain()
2029
int h=0,ta=1;q[0]=0;30
for(int i=1;i<=n;i++)
3138 printf("
%lld
",f[n]);
39return0;
40 }
BZOJ1010 玩具裝箱toy
1010 hnoi2008 玩具裝箱toy time limit 1 sec memory limit 162 mb submit 7631 solved 2924 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任...
BZOJ1010玩具裝箱Toy
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中.p教授有編號為1.n的n 件玩具,第 i件玩具經過壓縮後變成一維長度為ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果...
BZOJ1010 玩具裝箱toy
題目鏈結 bzoj1010 題目大意把n 個數分成若干段,從i到 j 分為一段的花費co st i j jk iva l k j i 求最小花費。分析 1.斜率優化dp,dp i min dp j co st j 1 i 2.先把l 1 設f x xk 1 val k x ff x d p x f ...