CDQ分治优化DP

博客介绍了如何使用CDQ分治优化动态规划(DP)的方法,通过例题NOI2007 cash展示平方的DP方程,并讨论了如何将DP转化为上凸壳问题,利用平衡树维护凸包并进行切线查询。接着,博主探讨了CDQ分治的具体步骤,包括分区间、更新DP值和离线处理斜率。最后,博主提到了当存在额外条件时,如何利用CDQ保持单调性以优化解题过程。
摘要由CSDN通过智能技术生成

昨天被学军的公开赛虐傻了,才发现自己还不会用CDQ优化DP,吓得赶紧去填坑。。。

普通的CDQ就是对二分操作,计算前半部分的插入对后半部分的询问的影响。

那么如何用CDQ优化DP呢?

看一道例题:

NOI2007 cash

不难推出平方的dp方程:

f[i] = max(f[i-1], f[j]/(R[j]*A[j]+B[j])*R[j]*A[i] + f[j]/(R[j]*A[j]+B[j])*B[i])   (j<i)

复杂度是O(n^2)的

由于这些变量中并不存在单调关系,所以使不能用单调性优化的

观察式子,我们设x[j] = f[j]/(R[j]*A[j]+B[j])*R[j],y[j] = f[j]/(R[j]*A[j]+B[j])

不难吧转移方程写成如下形式

f[i] = max(f[i-1], x[j]*A[i] + y[j]*B[i])   (j<i)

点积的形式?

不难发现,这样的最大值一定是在点集(x[j],y[j])的凸包上的点,更确切的说,这个点能与点(A[i],B[i])组成凸包的偏上的切线

很明显我们可以用平衡树来维护上凸壳,然后再凸壳上找到切线。

问题似乎的到了解决,但是这样的变成复杂度太高了,几乎很难在赛场上写出并调试正确。

于是我们就有了一个强有力的替代品——CDQ分治。

我们可以看到dp的过程就是不断的计算出新的f值再用其组成新的点来放进凸包中

其实我们可以把这个过程理解成这样:计算f[1],在平面上插入(x[1],y[1]),计算f[2],在平面上插入(x[2],y[2])……

这样我们就可以用CDQ分治来优化这个过程了

具体过程如下:

Solve(l,r)

     Solve(l,mid)

     利用f[l~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值