首页 > 代码库 > 有关动态规划(主要是数位DP)的一点讨论

有关动态规划(主要是数位DP)的一点讨论

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家在研究多阶段决策过程的优化问题时,提出了最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法--动态规划。

——以上内容,节选自http://baike.so.com/doc/6995222-7218096.html

《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

上方内容可以无视,下面为正题:

  首先是有关数位DP的内容:

  • 数位DP是解决把一个数字区间里所有数字按位拆分再进行计算或计数的问题的动态规划算法。

如解决对于区间 [l,r)求数位中不含某数字的数字的个数的问题:

    在数据范围非常小时——即r<1000000时可以考虑直接用穷举法,但当数据范围极大时——r<100000000,穷举法显然不合适,在这里就要考虑数位DP的方法:

    分析一个特殊情况——当r为10的N次方,l=0时,我们可以很轻易的用DP(线性的)的思想求解

 如我们可以解出[0,1000);

 这时,我们进而可以解得[1000,2000),[2000,3000),[3000,4000).......

   于是端点有效数字只有一位且有效数字差一的区间已经可解了,然后我们可以把任意区间分解为我们已经可解的区间(可以理解为提取数位),对于这些小区间求解(应该在之前预处理),然后因加法原理而求和。

 在代码实现的细节上,不建议真的对[l,r)直接分解,这样将把代码写得十分复杂,可以考虑求解[0,r)和[0,l)然后作差。

 如分解3位数212;

  第一位取0时调用f(3,0);

     取1时调用f(3,1);

     取2时:

           第二位取0时调用f(2,0);

                           取1时:

                                   第三位取0时调用f(1,0);

                                           取1时调用f(1,1);

                                           取1时调用f(1,2);

例题:

HDU P2089;

题解见:

有关动态规划(主要是数位DP)的一点讨论