这是一道想了好久的题…在用贫瘠的脑袋想了半天后我决定查看网上的解法–依旧想了半天.最后,我决定用博客记录下这道题的思路
题目
1 | 问题描述 |
思路
这道题的标准解法–动态规划
L=1
先思考最简单的一种情况:L=1,即一位数的情况
此时,2进制的数只有1
这一种可能;3进制的数有1 2
这两种可能.以此类推…K进制的数有K-1
种可能.很容易理解
L\K | 1 | 2 | 3 | … | 可能数 |
---|---|---|---|---|---|
1 | 0 | 1 | 2 | … | K-1 |
L=2
那么如果L=2呢?这时就要考虑多位数间是否符合关系了
为了简单起见,我们假设新添加的一位永远是最左边的一位,即最高位
,并且使用穷举法(滑稽)
假设进制K=4.当最高位为1时,右边的数值可能为1 3
;当最高位为2时,右边的数值可能为0 2
;当最高位为3时,右边的数值可能是0 1 3
.因此当L=2,K=4时,总共有3种可能
最高位 | 可能情况 | 可能数 |
---|---|---|
0 | 00 02 03 | 3 |
1 | 11 13 | 2 |
2 | 20 22 | 2 |
3 | 30 31 33 | 3 |
总可能数为2+2+3=7种(最高位不为0因此不计在内,但之后有用)
L=3
再进一步,让位数L=3,并仍假设进制K=4
当最高位为1时,右边的数值可能为1 3
,因此右边的数可能为11 13 30 31 33
;以此类推…
不难发现,最高位为1时,它的可能数和L=2时的可能数相关.不妨设位数为i,最高位为j,可能数为(i,j).那么(i,j)=(i-1,j1)+(i-1,j2)+…+(i-1,jn),jn是与j不相邻的数字
最高位 | 可能情况 | 方法 | 可能数 |
---|---|---|---|
1 | 111 113 130 131 133 | (2,1)+(2,3) | 5 |
2 | 200 202 203 220 222 | (2,0)+(2,2) | 5 |
3 | 300 302 303 311 313 330 331 333 | (2,0)+(2,1)+(2,3) | 8 |
因此总可能数为5+5+8=18
由于可能数的值均由前一项可能数推导而来,那么很容易想到用动态规划来做这道题
L=i
思路理清后,我们来重新审视一遍这道题–设位数为i,最高位的数值为j,最高位为j时的可能性为(i,j).那么可以得到(i,j)=(i-1,j1)+(i-1,j2)+...+(i-1,jn),jn是与j不相邻的数字
L=2,K=4的结果如下表格:
i\j/(i,j) | 0 | 1 | 2 | 3 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1 |
2 | (1,0)+(1,2)+(1,3)=3 | (1,1)+(1,3)=2 | (1,0)+(1,2)=2 | (1,0)+(1,1)+(1,3)=3 |
由上图,因为最高位可能为1,2,3,所以当L=2,K=4时总可能数为(2,1)+(2,2)+(2,3)=7
代码
1 | long kgood(int K, int L) |
感想
如果我自己想的话怎么都不可能想出来的,也许这就是我和算法大佬之间的差距吧-.-就我这智商不指望在算法领域能有什么成就了,只能当一个入门者了orz