蓝桥杯覆盖,状态压缩dp,python

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有一个国际象棋的棋盘,棋盘的大小为 8×88×8,即由 88 行 88 列共 6464 个方格组成。棋盘上有美丽的图案,因此棋盘旋转后与原来的棋盘不一样。

小蓝有很多相同的纸片,每张纸片正好能覆盖棋盘的两个相邻方格。小蓝想用 3232 张纸片正好将棋盘完全覆盖,每张纸片都覆盖其中的两个方格。

小蓝发现,有很多种方案可以实现这样的覆盖。如果棋盘比较小,方案数相对容易计算,比如当棋盘是 2×22×2 时有两种方案,当棋盘是 4×44×4 时有 3636 种方案。但是小蓝算不出他自己的这个 8×88×8 的棋盘有多少种覆盖方案。

请帮小蓝算出对于这个 8×88×8 的棋盘总共有多少种覆盖方案。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

先把demo贴在这,有空再回来写题解吧,有些累

n=int(input())
dp=[[0 for i in range((1<<n)+10)]for i in range(n+2)]
t=[0 for i in range(1<<n)]
for i in range(1<<n):#预处理每个合法状态
    mid=i
    cnt = 0
    vis=0
    for j in range(n):
        if (mid&1==1):
            if (cnt%2):
                vis=1
                break
            else:
                cnt=0
        else:
            cnt+=1
        mid=mid>>1
    if (cnt%2):
        continue
    if (vis!=1):
        t[i]=1
dp[0][0]=1
for i in range(1,n+1):
    for j in range(1<<n):
        for k in range(1<<n):
            if ( j&k==0 and t[j|k]): #凑出的状态合法:1,横放的不能冲突,2,凑出的该列的结果不能出现连续的零
                dp[i][j]+=dp[i-1][k]

print(dp[n][0])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值