1. 从铺砖游戏到算法思维
第一次接触骨牌铺方格问题时,我正在大学宿舍和室友玩多米诺骨牌。当时我们试图用标准尺寸的骨牌(1×2)铺满2×3的桌面,结果发现竟然有三种完全不同的排列方式。这个看似简单的游戏背后,隐藏着计算机科学中最强大的问题解决范式之一——动态规划。
动态规划本质上是一种用空间换时间的优化技术,它通过将复杂问题分解为相互关联的子问题来求解。骨牌问题恰好展示了这种思想:要计算2×n格子的铺法总数F(n),只需要知道F(n-1)和F(n-2)的值。这种"大事化小"的策略,正是动态规划区别于暴力穷举的关键所在。
在实际工程中,这种思想的应用远比想象中广泛。比如在文本编辑器的差异比较功能中,需要计算两个字符串的最小编辑距离;在股票交易系统里,要优化多时段买卖决策;甚至在游戏AI的路径规划中,都需要动态规划来高效求解。理解了这个铺砖游戏的本质,就掌握了打开这些复杂问题之门的钥匙。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递推关系的发现与证明
2.1 观察归纳法
让我们仔细分析2×n格子的铺法规律。当n=1时,只有竖直放置一种方式;n=2时,可以两个竖直或两个水平排列,共两种;n=3时如题目所示有三种。继续推导n=4的情况:
- 如果在最右侧竖直放置一个骨牌,剩下部分就是n=3的问题
- 如果在最右侧水平放置两个骨牌,它们必须上下并列,剩下部分就是n=2的问题
因此F(4)=F(3)+F(2)=3+2=5种。通过数学归纳法可以证明,对于任意n≥3,都有F(n)=F(n-1)+F(n-2)。
这个递推关系与著名的斐波那契数列完全一致。不同之处在于初始条件:斐波那契数列通常定义为F(1)=1,F(2)=1,而我们的铺砖问题则是F(1)=1,F(2)=2。这种微妙的差异提醒我们,在实际建模时,初始条件的确定与递推关系同样重要。
2.2 逆向思维验证
为了确保我们的递推公式正确,可以采用逆向思维验证法。假设我们需要铺满2×n的格子,考虑最后一步的操作只有两种可能:
- 最后放置的是竖直骨牌:这种情况下,前n-1列必须已经铺满,方案数就是F(n-1)
- 最后放置的是水平骨牌:由于骨牌不能悬空,必须同时占据第n列和第n-1列的上或下位置,因此前n-2列必须已经铺满,方案数是F(n-2)
这两种情况互斥且完备,因此总数必然是两者之和。这种思考方式不仅验证
