【发布时间】:2020-11-23 03:18:14
【问题描述】:
我正在 GeeksForGeeks 上学习动态编程,遇到了 Tiles Stacking Problem 及其解决方法的问题
高度为 n 的稳定塔是由恰好 n 个单位高度的瓷砖组成的塔,垂直堆叠的方式是不会将较大的瓷砖放置在较小的瓷砖上。示例如下:
我们有无限数量的大小为 1、2、...、m 的图块。任务是计算可以用这些瓦片建造的高度为 n 的不同稳定塔的数量,但限制是您可以在塔中最多使用 k 个每种尺寸的瓦片。
注意:当且仅当存在高度 h (1
Input : n = 3, m = 3, k = 1. Output : 1 Possible sequences: { 1, 2, 3}. Hence answer is 1. Input : n = 3, m = 3, k = 2. Output : 7 {1, 1, 2}, {1, 1, 3}, {1, 2, 2}, {1, 2, 3}, {1, 3, 3}, {2, 2, 3}, {2, 3, 3}.
解决的方法是使用从 1 到 m 的数字来计算长度为 n 的递减序列的数量,其中每个数字最多可以使用 k 次。我们可以使用 n-1 的计数递归地计算 n 的计数。
声明一个二维数组 dp[][],其中每个状态 dp[i][j] 使用从 j 到 m 的数字表示长度为 i 的递减序列的数量。我们需要注意一个数字最多可以使用 k 次这一事实。这可以通过考虑一个数字出现 1 到 k 次来完成。因此我们的递归关系变为:
此外,我们可以使用这样一个事实,即对于固定的 j,我们使用 i 的前 k 个值的连续值。因此,我们可以为每个状态维护一个前缀和数组。现在我们已经摆脱了每个状态的 k 因子。
这个算法我已经读了很多遍了,但我不明白它以及如何证明它的准确性。我试图在互联网上找到该指南,但只有它的变体。请帮我解释一下。
【问题讨论】:
标签: c++ algorithm dynamic-programming