Preface Numbering(还没好好看USACO的解答)

好吧,这么一个结构简单明确的题我做了半天才做出来(确切的说是从下午一直做到晚上)—|||

(1)因为刚看了前面的关于动态规划知识,所以在这个地方就又想到找一些规律出来。比如21和22其实这两个数字的十位都是20,对于每个数字都要将20--》II,调用一次转换子函数。这样子的话,会产生很多的重复工作。

      由于转换的方式是将n3n2n1n0,每一个位置分别考虑,相邻的位置不会互相影响(意思就是比如说123,那么我们在转换2的时候,只考虑十位,不需要考虑百位和个位)。

      这样子的话,可以预先将每个数字都做拆分,然后统计从1---n,共有多少个1、2、3、3……9,多少个10、20、30、……90以及多少个100、200、300、……900、1000.

设m在1-9之间,那么统计公式为

f(n3n2n1n0) = n/10^(i+1) * 10^ i   +  0       m > ni

                   = n/10^(i+1) * 10^ i   + 1        m = ni

                   = n/10^(i+1) * 10^ i   + 10^i    m < ni

这样子可以大大减少重复工作。

原文地址:https://www.cnblogs.com/growup/p/2031091.html