abc 345 D
lambda 表达式中,递归的实现方式
exit(0);
关闭所有文件,终止所有正在进行的进程,参数表示 0 正常退出,1 异常退出
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, h, w;
cin >> n >> h >> w;
vector<PII> a(n);
vector<int> vis(n);
vector<vector<int>> f(h + 1, vector<int> (w + 1));
for (int i = 0; i < n; i ++) cin >> a[i].first >> a[i].second;
auto dfs = [&](auto self, int x, int y) -> void {
if (x == h) {
cout << "Yes\n";
exit(0);
}
if (y == w) {
self(self, x + 1, 0);
}
if (f[x][y]) {
self(self, x, y + 1);
}
for (int i = 0; i < n; i ++) {
if (!vis[i]) {
vis[i] = 1;
auto [dx, dy] = a[i];
for (int t = 0; t < 2; t ++) {
if (dx + x <= h && dy + y <= w) {
int ok = 1;
for (int j = 0; j < dx; j ++)
for (int k = 0; k < dy; k ++)
if (f[j + x][k + y]) ok = 0;
if (ok) {
for (int j = 0; j < dx; j ++)
for (int k = 0; k < dy; k ++)
f[j + x][k + y] = 1;
self(self, x, y + 1);
for (int j = 0; j < dx; j ++)
for (int k = 0; k < dy; k ++)
f[j + x][k + y] = 0;
}
}
swap(dx, dy);
}
vis[i] = 0;
}
}
};
dfs(dfs, 0, 0);
cout << "No\n";
return 0;
}
abc 344 D
分组背包问题的板子题
jls 每组考虑了一次,这也是分组背包问题的核心
每个位置组内竞争,那个效果最好用 dp 记录那个,这样取答案的时候,每组只在一段中发挥了作用
abc 343 D
用 map 模拟