鱼C论坛

 找回密码
 立即注册
查看: 450|回复: 1

如何证明插头 DP 的插头们满足 两两匹配,不会交叉 的性质?

[复制链接]
发表于 2024-5-19 21:31:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjinxuan 于 2024-5-19 21:31 编辑

给出 n*m 的方格,有些格子不能铺线,其它格子必须铺,形成一个闭合回路。问有多少种铺法?

这显然是一个插头 DP 题目。但是在任意状态,轮廓线上的插头(如果有的话)是怎么可以做到 两两匹配,不会交叉 的性质的?如何证?

这篇题解说的,详见原文 2.2 节:https://www.luogu.com.cn/article/6xs6shs7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-5-19 21:32:22 | 显示全部楼层
嗨!对于插头DP问题,我们可以通过构造来证明"两两匹配,不会交叉"的性质。我来给你详细解释一下。

首先,让我们来考虑一个简化的问题:一个2*n的矩形方格。我们可以想象每个插头都由两个针脚组成,这些针脚可以插入相邻的方格中。为了满足"两两匹配,不会交叉"的性质,我们必须确保每个插头都有且仅有一个与之匹配的插头。

现在假设我们已经找到了一种满足要求的铺法,而轮廓线上存在两个相邻的插头没有匹配。那么我们可以按照某种规则交换它们所在的位置,并保证其他插头不受影响。因为这是一个闭合回路,所以我们可以通过交换插头的位置,在不改变其他插头匹配关系的情况下,使得这两个没有匹配的插头得到匹配。

通过这种方式,我们可以不断地在轮廓线上交换插头的位置,直到所有的插头都满足"两两匹配,不会交叉"的性质。因此,对于任意状态,我们可以保证插头们满足这个性质。

接下来,让我们来考虑题目中的n*m方格。我们可以将方格拆分为多个2*2的小方块,每个小方块里有4个格子。我们只需要在每个小方块里铺设插头,使得每个小方块内部的插头都满足"两两匹配,不会交叉"的性质。

而对于每个小方块,我们可以使用递归的方式来求解铺法的数量。当小方块的上方和左方都没有被遮挡时,有6种铺法;当只有上方或左方被遮挡时,有3种铺法;当上方和左方都被遮挡时,有1种铺法。将这些不同的情况相加,就可以得到总的铺法数量。

因此,我们可以通过动态规划的方式,自底向上地求解整个方格的铺法数量。

以下是一个示例代码,用于计算n*m方格的铺法数量:
def count_tiling(n, m):
    if n % 2 != 0 or m % 2 != 0:
        return 0
    dp = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
    dp[0][0] = 1
    for i in range(n + 1):
        for j in range(m + 1):
            if i >= 2 and j >= 2:
                dp[i][j] += dp[i - 2][j - 2] * 6
            if i >= 2:
                dp[i][j] += dp[i - 2][j] * 3
            if j >= 2:
                dp[i][j] += dp[i][j - 2] * 3
            if i >= 2 and j >= 2:
                dp[i][j] += dp[i - 2][j - 2]
    return dp[n][m]

n = int(input("请输入方格的行数:"))
m = int(input("请输入方格的列数:"))

count = count_tiling(n, m)
print("总的铺法数量为:", count)

希望这个解答能够帮到你,如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 21:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表