当前位置: 首页 > news >正文

题解:P12097 [NERC2024] Fix Flooded Floor

这个人居然还活着!

~~什么黄题,绿题还差不多。~~

由于 $n$ 非常大,所以要用 $O(n\log n)$ 或者 $O(n)$ 级别的时间复杂度。

所以这个题使用 DP。

# 状态设计
$dp[i][mask]$ 表示处理到第 $i$ 列时,第 $i$ 列被覆盖情况的方案数,其中 $mask$ 是一个2位的二进制数:

- 第 $0$ 位:表示**第二行**是否被一个从左边来的横放骨牌覆盖。
- 第 $1$ 位:表示**第一行**是否被一个从左边来的横放骨牌覆盖。

# 状态转移
对于每一列:
1. 当前列的格子状态:哪些格子需要覆盖(坏的地板 `.`)
2. 从左边横放过来的影响(即当前 $mask$)
3. 当前列可能采取的放置方式

考虑:

## 当前列已经被完全覆盖
如果从左边横放过来的骨牌已经覆盖了当前列所有需要覆盖的坏格子,那么直接转移到下一列,且下一列没有从当前列横放过去的骨牌。

## 两个格子都需要覆盖
如果第一行和第二行的格子都是坏的且没有被左边覆盖:

1. 竖放一个 $1\times 2$ 的骨牌

- 转移到下一列,$mask=0$
2. 两个横放

- 当前列第一行和第二行都横放,延伸到下一列
- 转移到下一列,$mask=3$

## 只有第一行需要覆盖
在第一行横放一个骨牌(如果下一列的第一行格子是坏的):

- 转移到下一列,$mask=1$

# 算法步骤
基本的输入输出就不做解释。

遍历每一列 $i=1$ 到 $n$:

- 对于当前列的每个 $mask$ 状态,检查是否与好格子冲突
- 根据当前列需要覆盖的格子情况,尝试各种放置方式
- 更新下一列的状态

输出答案 $dp[n+1][0]$。

# AC code
```cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s0, s1;
cin >> s0 >> s1;
int g[2][n+2];
for (int j = 1; j <= n; ++j) {
g[0][j] = (s0[j-1] == '.') ? 0 : 1;
g[1][j] = (s1[j-1] == '.') ? 0 : 1;
}
int dc[4] = {0};
dc[0] = 1;
for (int i = 1; i <= n; ++i) {
int dn[4] = {0};
for (int m = 0; m < 4; ++m) {
int val = dc[m];
if (val == 0) continue;
if ((g[0][i] == 1 && (m & 2)) || (g[1][i] == 1 && (m & 1))) {
continue;
}
bool need0 = (g[0][i] == 0 && ((m & 2) == 0));
bool need1 = (g[1][i] == 0 && ((m & 1) == 0));
if (!need0 && !need1) {
dn[0] = min(2, dn[0] + val);
} else if (need0 && need1) {
dn[0] = min(2, dn[0] + val);
if (i+1 <= n && g[0][i+1] == 0 && g[1][i+1] == 0) {
dn[3] = min(2, dn[3] + val);
}
} else if (need0 && !need1) {
if (i+1 <= n && g[0][i+1] == 0) {
dn[2] = min(2, dn[2] + val);
}
} else {
if (i+1 <= n && g[1][i+1] == 0) {
dn[1] = min(2, dn[1] + val);
}
}
}
for (int m = 0; m < 4; ++m) {
dc[m] = dn[m];
}
}
int ans = dc[0];
if (ans == 0) {
cout << "None\n";
} else if (ans == 1) {
cout << "Unique\n";
} else {
cout << "Multiple\n";
}
}
return 0;
}
```

http://www.jsqmd.com/news/178461/

相关文章:

  • 3个免费方法!10款亲测有效的降AI率工具推荐(2025最新降AI味指南)
  • 2026.1.1总结
  • Rust 结合 Tesseract OCR 进行验证码识别
  • Rust 结合 Tesseract OCR 进行验证码识别
  • 深度学习计算机毕设之基于VGG的图像风格迁移算法实现及系统应用实现
  • DL之Transformer之mHC:《mHC: Manifold-Constrained Hyper-Connections》翻译与解读
  • 2026最新盘点:最火的10款降ai率工具汇总,不花一分钱真的靠谱吗?(附踩坑指南)
  • 用 Swift 结合 Tesseract 进行验证码识别
  • 计算机深度学习毕设实战-基于VGG的图像风格迁移算法实现及系统应用实现
  • 网速管家电脑版
  • 免费开源Http、Https抓包工具
  • 深度学习毕设选题推荐:基于VGG的图像风格迁移算法实现及系统应用实现
  • 基于Springboot工作量统计管理系统【附源码+文档】
  • 【计算机毕业设计案例】基于机器学习的人脸发型推荐算法研究与应用实现
  • django基于 Python 的高校大学生职业就业推荐系统的设计与实现-vue
  • 【计算机毕业设计案例】基于VGG的图像风格迁移算法实现及系统应用实现
  • Webmozart Assert:PHP类型安全的强力守卫
  • 跨设备粘贴板管理工具 CrossPaste
  • java基于SpringBoot的中华诗词文化交流平台的设计与实现-vue
  • 深度学习毕设项目推荐-基于机器学习的人脸发型推荐算法研究与应用实现
  • 深度学习毕设项目:基于VGG的图像风格迁移算法实现及系统应用实现
  • java基于SpringBoot的乐器商城商品推荐系统设计与实现-vue
  • C/C++ 中的 __asm volatile 函数
  • 深度学习毕设项目推荐-基于VGG的图像风格迁移算法实现及系统应用实现
  • 扫描线/矩形面积并
  • 2025年泳池除湿机选购指南:口碑企业深度测评,国内口碑好的泳池除湿机口碑推荐优质品牌榜单更新 - 品牌推荐师
  • java基于SpringBoot的摇滚音乐鉴赏网站的设计与实现-vue
  • 对《从理论到界面:六维坐标系与三值九层立体结构的工具化路径》的研究
  • AI生成PPT好用吗?工作总结场景下的工具排名更新
  • AI应用架构师的质量保证 checklist:20个必做项(附模板)