CDQ分治(含例题:货币兑换、PARTIAL ORDER)

本文介绍了CDQ分治方法,这是一种特殊的分治策略,源自2008年的OI作业。文章通过货币兑换和PARTIAL ORDER问题举例,详细讲解了CDQ分治的应用。在货币兑换问题中,通过动态规划和平衡树解决了最优兑换策略,并分析了时间复杂度。PARTIAL ORDER问题的多个版本展示了CDQ分治的灵活运用。最后,文章总结了CDQ分治的优势和适用场景。
摘要由CSDN通过智能技术生成

最近在整理原来的一些资料,偶然想起原来搞OI时讲过一次CDQ分治的内容,这里分享给大家

 

目录

预备知识

常见递归复杂度

分治思想

CDQ分治例题

货币兑换

PARTIAL ORDER

问题2D版本

问题3D版本

问题4D简化版本

问题4D版本

问题100D版本

总结

题目推荐


CDQ分治是一种特殊的分治方法,在OI界初见于陈丹琦2008年国家集训队作业中

 

预备知识

常见递归复杂度

先来分析下面这个递归方程:

其时间复杂度如何分析?

将式子迭代两次得:

 

继续迭代,整理得:

 

我们发现式子的结构特别像一个树形结构,由此可引出递归树法:

图中的(a)(b)(c)(d)分别是递归树生成的第1,2,3...N步。每一节点中都将当前的自由项n^2留在其中,而将两个递归项T(n/2) + T(n/2)分别摊给了他的两个子节点,如此循环。

图中所有节点之和为:

因此原递归方程的时间复杂度为O(n^2)

可以得到递归树法的规则为:

  (1) 每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值;

  (2) 每个节点的分支数为k;

  (3) 每层的右侧标出当前层中所有节点的和。

 

那么通过该方法,可以推出这些式子:

  • T(n)=2T(n/2)+O(kn)的解是T(n)=O(kn log n)
  • T(n)=2T(n/2)+O(kn log n)的解是T(n)=O(kn log^2n)
  • T(n)=2T(n/2)+O(k)的解是T(n)=O(kn)        

 

分治思想

问题:给定序列Ai,求序列中的逆序对数

 

方法:归并排序实现:定义归并排序过程Merge(l,r)

Merge(l,r)

¤Merge(l,mid)

¤Merge(mid+1,r)

¤Count(l,mid,mid+1,r)

由于之前已执行过merge(1,mid),那么[l,mid]之间的元素是有序的,因此若i[l,mid],j[mid+1,r],若有a[i]>a[j]成立,则答案加上mid-i+1

 

CDQ分治例题

货币兑换

此题为NOI2007一试第二题

其实解决这个问题的突破口在提示

f[i]表示第i天全部将A,B券换成人民币的最多数目,p[i].a表示A券在第i天最多拥有的个数,p[i].b表示B券在第i天最多拥有的个数,则:

那么,对于第i天最后一次购买,它在第j天(i<j)的折合人民币就是:

于是:

因此,我们得到一个动态规划的算法,框架如下:

p[1].b=S / (A[1] * Rate[1] + B [1]) 
Ans=S
For  i = 2  to  n ← 枚举在哪一天卖出券
       For  j = 1  to  i-1   ← 枚举在哪一天买入券
               x=p[ j ].a * A[i ] + p[j ].b * B [i ]
              Ans=max{Ans,x}
       End For
       p [i ].b = Ans / (A[i ] * Rate[i ] + B[i ])
End For
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值