简单地树形DP
我们用f,g表示最大、最小值,0,1,2表示颜色然后直接推
递推公式请见程序233

1 /************************************************************** 2 Problem: 1864 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:24 ms 7 Memory:19244 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 #define Rep(i, n) for (i = 0; i < n; ++i) 14 using namespace std; 15 const int inf = (int) 1e9; 16 const int N = 500005; 17 18 int cnt, s[N][3], f[N][3], g[N][3]; 19 20 void dfs(int p) { 21 int i, j, k; 22 s[p][0] = getchar() - '0'; 23 if (!s[p][0]) { 24 f[p][0] = g[p][0] = 1; 25 return; 26 } 27 for (i = 1; i <= s[p][0]; ++i) { 28 s[p][i] = ++cnt; 29 dfs(cnt); 30 } 31 g[p][0] = g[p][1] = g[p][2] = inf; 32 if (s[p][0] == 1) { 33 Rep(i, 3) Rep(j, 3) 34 if (i != j) 35 f[p][i] = max(f[p][i], f[s[p][1]][j] + !i), 36 g[p][i] = min(g[p][i], g[s[p][1]][j] + !i); 37 } else { 38 Rep(i, 3) Rep(j, 3) Rep(k, 3) 39 if (i != j && j != k && i != k) 40 f[p][i] = max(f[p][i], f[s[p][1]][j] + f[s[p][2]][k] + !i), 41 g[p][i] = min(g[p][i], g[s[p][1]][j] + g[s[p][2]][k] + !i); 42 } 43 } 44 45 int main() { 46 dfs(cnt = 1); 47 printf("%d %d\n", max(max(f[1][0], f[1][1]), f[1][2]), min(min(g[1][0], g[1][1]), g[1][2])); 48 return 0; 49 }
By Xs酱~ 转载请说明
博客地址:http://www.cnblogs.com/rausen
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App