[LOJ2731] 「JOISC 2016 Day 1」棋盘游戏(DP计数)

该博客讨论了一个关于3×n棋盘游戏的问题,其中需要填充棋子以满足特定规则。博主提出了一种四联通图的概念,并通过动态规划(DP)的方法解决此问题。在分析无解情况后,博主将棋盘分块并独立处理,同时提供了状态转移方程,以计算不同填法的数量。最后,博主提到了算法的时间复杂度和在处理新联通块时的注意事项。
摘要由CSDN通过智能技术生成

题意

  • 给你一个 3 × n \rm 3 \times n 3×n的棋盘,棋盘上有一些棋子,问有多少种不同填棋子的顺序可以填满棋盘,一个位置可以被填棋子当且仅当它的左右已经填了棋子或者它的上下都填了棋子。( n ≤ 2000 \rm n \le2000 n2000

首先判掉无解的情况,如果第一行或者第三行有连续两个空棋子,或者四个边角没有填棋子,就不存在填满棋盘的方案。

把这个棋盘当做一个四联通图,我们可以发现每个空格组成的联通块是互不影响的,我们可以分联通块DP,再组合一下各个联通块的方案就好了。

对于某个联通块,我们观察到每一列的填法只与上一列的棋子是通过哪种规则填的和填的时间有关,我们记 f ( 0 / 1 , i , j ) \rm f(0/1,i,j) f(0/1,i,j)表示第 2 \rm2 2行第 i \rm i i列的格子是在上下格子填完之后还是左右格子填完之后,是在当前联通块操作序列中第 j \rm j j个操作的方案数,那么分类讨论上一列的格子通过哪种规则填来转移。

S i z e \rm Size Size为当前联通块的大小, s u m \rm sum sum为当前列上下的空格子数:

  • 如果上一个格子是通过填好上下格子再填的话,这个格子也通过填好上下格子再填,那么这两列是互不影响的。
    f ( 0 , i , j ) = ∑ k = 1 S i z e f ( 0 , i − 1 , k ) × A ( j − 1 , s u m ) \rm f(0,i,j)=\sum_{k = 1}^{Size}f(0,i-1,k)\times A(j-1,sum) f(0,i,j)=k=1Sizef(0,i1,k)×A(j1,sum)
  • 如果上一个格子是通过填好左右格子再填的话,这个格子必须通过填好上下格子再填,那么当前格子必须先填。
    f ( 0 , i , j ) = ∑ k = j − s u m − 1 S i z e f ( 1 , i − 1 , k ) × A ( j − 1 , s u m ) \rm f(0,i,j)=\sum_{k=j-sum-1}^{Size}f(1,i-1,k) \times A(j-1,sum) f(0,i,j)=k=jsum1Sizef(1,i1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值