洛谷P1040加分二叉树-题解
题目:
思路:
这题在一个细节上很奇怪,它给树是按中序遍历给的
而且只给了中序遍历
这意味着我们可以通过自己的方式来构造这棵树
我们回想一下——
在中序遍历中,一个根节点的左儿子是?
——这个节点的左边所有
右儿子是?
——右半部分
如果用区间表示呢?
——[i.k-1],[k+1,j]
为什么没有k?
——根节点不在左右儿子之列
我们一回来看这道题,发现区间DP简直是专门设计出来解决这类题的
枚举k,利用左右区间值计算大区间值
基本就是区间DP用惯了的套路
至于输出遍历
只要在DP时记下这个区间的根,然后递归即可
代码:
#include <bits/stdc++.h> using namespace std; long long n; long long f[50][50], root[50][50]; void print(long long l, long long r) { if (l > r) return; cout << root[l][r] << ' '; if (l == r) return; print(l, root[l][r] - 1); print(root[l][r] + 1, r); } int main() { cin >> n; for (int i = 1; i <= n; i++) { cin >> f[i][i]; f[i][i - 1] = 1; root[i][i] = i; } for (int len = 1; len <= n; len++) { for (int i = 1; i + len <= n; i++) { int j = i + len; f[i][j] = f[i][i] + f[i + 1][j]; root[i][j] = i; for (int k = i + 1; k < j; k++) { if (f[i][j] < f[i][k - 1] * f[k + 1][j] + f[k][k]) { f[i][j] = f[i][k - 1] * f[k + 1][j] + f[k][k]; root[i][j] = k; } } } } cout << f[1][n] << endl; print(1, n); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架