T1:三色地图
本题难度中等,用 dfs
一边遍历每个点,一边枚举每个点的颜色。
直接枚举每个点的颜色是 会超时。所以在搜索时,要判断当前颜色是否和相邻点同色,如果同色要剪枝。原图不一定连通,所以要对每个连通块做染色搜索,将每个连通块的染色方案数相乘即为答案
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; int n; vector<vector<int>> to; vector<int> used, col; vector<int> vs; void dfs(int v) { if (used[v]) return; used[v] = 1; vs.push_back(v); for (int u : to[v]) dfs(u); } ll now; void dfs2(int i) { if (i == vs.size()) { now++; return; } int v = vs[i]; rep(c, 3) { col[v] = c; bool ok = true; for (int u : to[v]) { if (col[u] == c) ok = false; } if (!ok) continue; dfs2(i + 1); } col[v] = -1; } int main() { int m; cin >> n >> m; to = vector<vector<int>>(n); rep(i, m) { int a, b; cin >> a >> b; --a; --b; to[a].push_back(b); to[b].push_back(a); } ll ans = 1; used = vector<int>(n); col = vector<int>(n, -1); rep(i, n) { if (used[i]) continue; ans *= 3; vs = vector<int>(); dfs(i); int s = vs.size(); col[vs[0]] = 0; now = 0; dfs2(1); ans *= now; } cout << ans << '\n'; return 0; }
T2: 最大值和最小值
本题难度较大,题目条件“最大数等于 ,最小数等于 ” 可以看作:子段内所有数满足 且子段内含有至少一个 和至少一个 。
我们考虑用 dp[i][1/2/3]
记录 "以 结尾的满足要求的子段个数",按照是否含有 或 分类讨论
最后要注意 和 有可能相同
- 若 ,答案是
- 若 ,答案是
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现