为以下问题提供动态编程解决方案。给定数n> 0, 计算具有可被3整除的n位数的自然数的数量,而不是 包含数字“1”。
提示:该表的大小为n×3
我突然想到这一天不能发现闷热。
答案 0 :(得分:1)
动态编程通常涉及将解决方案与较小的子问题相结合的递归关系。
对于您的问题,请注意,对于可被3整除的数字,其数字总和必须可被3整除。让我们:
dp[i, s] = how many numbers with i digits have sum of digits s
我们有:
dp[i, s] = dp[i - 1, s] + <- use digit 0
dp[i - 1, s - 2] + <- use digit 2
dp[i - 1, s - 3] + <- use digit 3
...
dp[i - 1, s - 9] <- use digit 9
这确实可以通过使用模n x 3
求和来优化到n x S
表(它现在是3
)。那个和基础案例留作练习或至少延迟到你展示一些工作。