題目描述
p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中。p教授有編號為1…n的n件玩具,第i件玩具經過壓縮後變成一維長度為ci.為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果乙個一維容器中有多個玩具,那麼兩件玩具之間要加入乙個單位長度的填充物,形式地說如果將第i件玩具到第j個玩具放到乙個容器中,那麼容器的長度將為 x=j-i+sigma(ck) i<=k<=j 製作容器的費用與容器的長度有關,根據教授研究,如果容器長度為x,其製作費用為(x-l)^2.其中l是乙個常量。p教授不關心容器的數目,他可以製作出任意長度的容器,甚至超過l。但他希望費用最小.
輸入輸出格式
輸入格式:
第一行輸入兩個整數n,l.接下來n行輸入ci.1<=n<=50000,1<=l,ci<=10^7
輸出格式:
輸出最小費用
分析:
1.觀察到本題的階段性,首先推出dp方程dp[i]=min,令f[i]=sum[i]+i,c=l+1,則 dp
[i]=
(min
)dp[
j]+(
f[i]
−f[j
]−c)
2 2.因為f[i]具有單調性,故考慮斜率優化dp
3.設決策點k < j 且j優於k則 dp
[k]+
f[i]
2+f[
k]2+
c2−2
∗f[i
]∗f[
k]−2
c∗f[
i]+2
c∗f[
k]>dp
[j]+
f[i]
2+f[
j]2+
c2−2
∗f[i
]∗f[
j]−2
c∗f[
i]+2
c∗f[
j]最後得(d
p[j]
−dp[
k]+f
[j]2
−f[k
]2)(
f[j]
−f[k
])<2(
f[i]
−c)①
4.令w[i]為2(f[i]-c),設s(
j,k)
=(dp
[j]−
dp[k
]+f[
j]2−
f[k]
2)(f
[j]−
f[k]
) 結論 1:對於 i 的兩個決策點 k,j(k < j),如果有 s(j,k) < w[i],則決策 j比 k 優,反之,k 比 j 優。
結論 2:對於三個決策點 k,j,i(k < j < i),如果有 s(j,k) > s(i,j),則決策 j永遠不會成為最優決策。
那麼,我們可以用乙個單調佇列來維護決策,利用以上決策剔除無用決策
①對於隊首,如果 s(q[l+1],q[l]) < w[i],說明 q[l+1]比 q[l]優,去掉q[l],一直到不滿足條件為止。
②此時 q[l]就是當前點的最優決策,根據狀態轉移方程計算 f[i]的值。
③對於隊尾,如果 s(q[r],q[r-1]) > s(i,q[r]),證明 q[r]永遠不會成為最優決策,去掉 q[r],一直到不滿足條件為止,然後將決策 i 入隊。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=50010;
ll c[maxn],f[maxn],sum[maxn];
ll dp[maxn];
intq[maxn*10];
int n,l;
int t;
double s(int
x,int
y)int main()
printf("%lld",dp[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教授要求在乙個一維容器中的玩具編號是連續的。同時...