这可以通过动态编程来完成。
说出用户输入n = K。您可以通过三种方式达到K.
If K has 4 or 0 as last digit, then from the number formed by removing last digit.
Else from 2 * K
所以如果预填充的方式来覆盖每一个号码,则可以从输入数原路返回到起始号码4.
允许S
在阵列中存储一对数字,即先前从数量和方法可以到达S
。可以有多种方式来达到S,但你可以存储任何。例如 ,例如S[44] = {88,3} or {4,1}
。
但困难的任务是找到数组的上限,直到预先填充的位置。 N的最大值可以是100. 100可以从10实现,所以不成问题。让我们检查人数较少
99 <- 198 <- 396 <- 792 <- 1584 <- 158
98 <- 196 <- 392 <- 784 <- 78
所以预填充数据时,要求直到S [1584]
让M = 1584
让填充数组S
。最初设置的S
所有索引到null
for i from 1 to M
if i has 0 or 4 at unit place
S[i] = {no formed by removing unit place digit, method 1 or 2}
There are gaps remaining which were to be filled by method 3, lets also fill them, i/2 and furthur if i is even
J = i
k = i/2
while(j is even and S[k] is null)
S[k] = {j, 3}
j = k;
k = j/2
当所有S中所有填充,让在原问题 N = 7给予做对于s一些值如下
在
S[1] = {2,3}
S[2] = {4,3}
S[3] = {6,3}
S[4] = {0,1}
S[5] = {10,3}
S[6] = {12,3}
S[7] = {14,3}
S[8] = {16,3}
S[9] = {18,3}
S[10] = {1,2}
S[11] = {22,3}
S[12] = {24,3}
S[13] = {26,3}
S[14] = {1,1}
S[7] = {14,3} , so store 3 and check for 14
S[14] = {1,1}, so store 1 and check for 1
S[1] = {2,3}, so store 3 and check for 2
S[2] = {4,2}, so store 3 and 4 is reached, and you are done.
打印存储的值反格式是3,3,1,3。
这对我来说没有意义:每个操作是如何选择的?它与用户输入有什么关系?这里的实际算法是什么? – UnholySheep
你尝试过什么吗? –
@UnholySheep这是我的问题。我不知道。我只需要一个数字,也许有一个变量初始化为'4'并计算数字。 –