BZOJ 1010 斜率DP
2017-02-16 16:22
302 查看
先写出dp方程:
dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j小于i)
令f[i]=sum[i]+i,c=1+l
则dp[i]=min(dp[j]+(f[i]-f[j]-c)^2)
化简之后发现方程形如:
f[i]=Min(a[i]∗b[j]+c[j]+d[i])
想到用斜率优化
决策单调性证明和斜率表达式
已知x(j,k)小于f(i)时k决策更优,
又因为f【i】是递增的,把斜率维护一个下凸,然后就都是套路了,参考上一题hdu3407.(斜率方程出来后就基本一样了)
然后就是要注意这里没有直接用up/down去和f【i】直接比大小,而是用up和down*f【i】这样去比较,所以要注意down的正负号问题,不然就反了。
dp[i]=min(dp[j]+(sum[i]-sum[j]+i-j-1-L)^2) (j小于i)
令f[i]=sum[i]+i,c=1+l
则dp[i]=min(dp[j]+(f[i]-f[j]-c)^2)
化简之后发现方程形如:
f[i]=Min(a[i]∗b[j]+c[j]+d[i])
想到用斜率优化
决策单调性证明和斜率表达式
已知x(j,k)小于f(i)时k决策更优,
又因为f【i】是递增的,把斜率维护一个下凸,然后就都是套路了,参考上一题hdu3407.(斜率方程出来后就基本一样了)
然后就是要注意这里没有直接用up/down去和f【i】直接比大小,而是用up和down*f【i】这样去比较,所以要注意down的正负号问题,不然就反了。
#include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <deque> using namespace std; typedef long long LL; const int maxn=50005; int L,R,n; LL s[maxn],C; int q[maxn]; LL dp[maxn]; LL getDP(int i,int j){ return dp[j]+(s[i]-s[j]-C)*(s[i]-s[j]-C); } LL UP(int k,int j){ return dp[j]-dp[k]+(s[j]+C)*(s[j]+C)-(s[k]+C)*(s[k]+C); } LL DOWN(int k,int j){ return 2*(s[j]-s[k]); } int main(){ scanf("%d%lld",&n,&C); C++; for(int i=1;i<=n;i++){ LL t; scanf("%lld",&t); s[i]=s[i-1]+t; } for(int i=1;i<=n;i++){ s[i]+=i; } L=R=0; dp[0]=0; q[0]=0; for(int i=1;i<=n;i++){ while(L<R&&UP(q[L],q[L+1])<=s[i]*DOWN(q[L],q[L+1])){ L++; } dp[i]=getDP(i,q[L]); while(L<R&&UP(q[R-1],q[R])*DOWN(q[R],i)>UP(q[R],i)*DOWN(q[R-1],q[R])){ R--; } q[++R]=i; } printf("%lld\n",dp ); return 0; }
相关文章推荐
- 【斜率DP】BZOJ 1010:玩具装箱
- BZOJ 1010 [HNOI2008]玩具装箱toy (斜率优化DP)
- 【斜率优化DP】BZOJ1010 [HNOI2008]玩具装箱toy
- bzoj1010 [HNOI2008]玩具装箱toy 斜率优化 DP
- 【BZOJ1010】【codevs1319】玩具装箱,斜率优化DP
- dp斜率优化 bzoj 1010玩具装箱题解
- bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp
- bzoj 1010 [HNOI2008]玩具装箱toy(DP的斜率优化)
- bzoj1010: [HNOI2008]玩具装箱toy 斜率优化DP
- [BZOJ1010][HNOI2008]玩具装箱(决策单调性/斜率优化DP)
- _bzoj1010 [HNOI2008]玩具装箱toy【斜率优化dp】
- [bzoj1010] [HNOI2008]玩具装箱toy (斜率优化DP)
- BZOJ 1010 玩具装箱 toy (DP斜率优化)
- 【bzoj1010】[HNOI2008]玩具装箱toy 斜率优化dp
- bzoj1010 toy玩具装箱 (斜率优化dp)
- 斜率优化dp专题 & BZOJ1010 HNOI2008 玩具装箱toy
- 【bzoj1010】玩具装箱toy 斜率优化dp
- BZOJ-1010 [HNOI2008]玩具装箱toy (DP斜率优化)
- 【bzoj1010】玩具装箱toy——斜率优化dp
- BZOJ 1010: [HNOI2008]玩具装箱toy(DP+斜率优化)