SP2530 GNY07H-Tiling a Grid With Dominoes 题解

题目链接

题意

给定一个大小为 4 × n 4 \times n 4×n 的平面,然后用 1 × 2 1 \times 2 1×2 的矩形铺满它,求有多少种铺法。

思路

典型的状压DP,和 Mondriaan's Dream 这道题很像。

对于每一行,我们用 1 1 1 表示铺了, 0 0 0 表示没铺。这样所组成的一个 0 , 1 0,1 0,1 串即为这一行的放置状态。

我们设 f i , S f_{i,S} fi,S 表示第 i i i 行的放置状态为 S S S 的方案数。则有: f i , S = ∑ f i − 1 , S ′ f_{i,S}=\sum f_{i-1,S'} fi,S=∑fi−1,S′。其中 S ′ S' S′ 为

能转移到状态 S S S 的状态。

但是,由 S S S 来推 S ′ S' S′ 并不好做,所以我们考虑由 S ′ S' S′ 来推 S S S。

对于当前行的状态 S S S ,它是由前一行的状态 S ′ S' S′ 转化过来的,显然,对于该行某个位置 j j j :

  1. 如果前一行该位置为 0 0 0,那么该位置可以竖放即 0 → 1 0 \to 1 0→1 ;
  2. 如果前一行连续两个位置为 0 0 0,那么这两个连续位置可以横放即 00 → 00 00 \to 00 00→00 ;
  3. 如果前一行该位置为 1 1 1,显然该位置不能再竖放,于是应该把该位置设置为 0 0 0,即 1 → 0 1 \to 0 1→0 。

每一行的转移过程可以用dfs来实现。

最后,我们枚举每一行,并枚举它的初始状态,然后进行dfs即可。

但是,这道题因为平面的宽度恒为 4 4 4 ,所以可以推式子。这个做法大家可以参考一下别人的题解,我就不讲了。其实是我不会

完整代码

注意多测......

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;ll f[1005][20],U=15;
void dp(int i,ll s,ll s1,ll s2,ll j){
	if(s1==U){f[i+1][s2]+=f[i][s];return ;}
	if(!(s1&(1<<j))){
		dp(i,s,s1|(1<<j),s2|(1<<j),j+1);
		if(j<3&&!(s1&(1<<(j+1))))
			dp(i,s,s1|(1<<j)|(1<<(j+1)),s2,j+2);
	}else dp(i,s,s1,s2&~(1<<j),j+1);
}
void MAIN(){
	cin>>n;
	memset(f,0,sizeof f);
	f[1][0]=1;
	for(int i=1;i<=n;i++)
		for(ll s=0;s<=U;s++)
			dp(i,s,s,0,0);
	cout<<f[n+1][0]<<"\n";
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T;cin>>T;for(int i=1;i<=T;i++)cout<<i<<" ",MAIN();
	return 0;
}

AC记录

相关推荐
NiceCloud喜云19 小时前
AutoClaw 接入自定义 Anthropic 端点:让 Kanban 工作流跑在自己的模型路由上
java·开发语言·c++·人工智能·python·eclipse·batch
Hua-Jay19 小时前
OpenCV联合C++/Qt 学习笔记(二十五)----加载深度神经网络模型及深度神经网络模型的使用
c++·笔记·qt·opencv·学习·计算机视觉·dnn
月光船幽幽20 小时前
Helio协议热切换实战解析
人工智能·动态规划·拓扑学
计算机安禾20 小时前
【c++面向对象编程】第49篇:面向对象的单元测试:用GoogleTest测试类
开发语言·c++·单元测试
坚定学代码20 小时前
如何在c++中使用MySQL
开发语言·c++·mysql
纽扣66720 小时前
【C++通关之路】C++ 继承深度全景指南:从语法陷阱到内存底层的终极复习
开发语言·c++
楼田莉子20 小时前
C++17特性:强制省略拷贝优化/折叠表达式/非类型模板参数/嵌套命名空间
开发语言·c++
xifangge202520 小时前
Steam/Epic 游戏启动报错 0xc000007b / msvcp140.dll 缺失?VC++ 运行库底层修复指南
开发语言·c++·游戏
zuowei288920 小时前
编程语言对比:C/C++/Java/C#/PHP
java·c语言·c++
Yuk丶20 小时前
厌倦了假AI对话?用本地大模型给UE注入真智能(已开源!)
c++·人工智能·开源·ue4·游戏程序·ue4客户端开发