码迷,mamicode.com
首页 > 其他好文 > 详细

斜率优化

时间:2020-01-22 21:29:38      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:最小值   while   cpp   amp   www   span   href   推出   int   

优化形如\(f_i=min/max(f_j+a_i×b_j+c_i+d_j)(j< i)\)\(DP\)方程

设存在两个决策点\(j,k\),且决策点\(j\)比决策点\(k\)更优,例如为取最小值时,得

\(f_j+a_i×b_j+c_i+d_j<f_k+a_i×b_k+c_i+d_k\)

\(-a_i(b_j-b_k)>(f_j+d_j)-(f_k+d_k)\)

\(-a_i>\frac{(f_j+d_j)-(f_k+d_k)}{b_j-b_k}\)

我们就得到了该\(DP\)方程所对应的\(x\)\(b_j\)\(y\)\(f_j+d_j\),斜率为\(-a_i\)

通过这样的方式也就可以推出其他方程的\(x,y\)和斜率

仓库建设中,\(DP\)方程为\(f_i=f_j+dis_i×(p_i-p_j)-(s_i-s_j)+c_i\)

其所对应的\(x\)\(p_j\)\(y\)\(f_j+s_j\),斜率为\(dis_i\)

\(code:\)

double x(int i)
{
    return p[i];
}
double y(int i)
{
    return f[i]+s[i];
}
double slope(int j,int k)
{
    return (y(j)-y(k))/(x(j)-x(k));
}

......

for(int i=1;i<=n;++i)
{
    while(h<t&&slope(q[h],q[h+1])<dis[i]) h++;
    f[i]=f[q[h]]+dis[i]*(p[i]-p[q[h]])-(s[i]-s[q[h]])+c[i];
    while(h<t&&slope(q[t],i)<slope(q[t],q[t-1])) t--;
    q[++t]=i;
}

斜率优化

标签:最小值   while   cpp   amp   www   span   href   推出   int   

原文地址:https://www.cnblogs.com/lhm-/p/12229626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!