反思---树上LIS
反思---树上LIS
题目描述
给你一棵 n个节点的树,树的每个节点上都有一个值 a[i] 。
现在要您求出从 1 号点到 i 号点的最短路径上最长上升子序列的长度。
就是单调栈优化+dfs回溯
对比两段代码的dfs部分:
//AC Code
inline void dfs(int u,int f){
int w=lower_bound(b+1,b+l+1,a[u])-b;
int tmpl=l,tmpx=b[w];
b[w]=a[u];
if(w>l) ++l;
ans[u]=l;
for(auto v:G[u]){
if(v==f) continue;
dfs(v,u);
}
l=tmpl,b[w]=tmpx;//回溯回未访问到u的状态
}
//68pts
inline void dfs(int u,int f){
int w=lower_bound(b+1,b+l+1,a[u])-b;
b[w]=a[u];
if(w>l) ++l;
ans[u]=l;
int tmpl=l,tmpx=b[w];
for(auto v:G[u]){
if(v==f) continue;
dfs(v,u);
l=tmpl,b[w]=tmpx;//回溯回访问到u,未访问v的状态
}
}
Q:同样表示还原状态,两者得分为何不同?
A:第二份代码其实没有将 访问v 对b数组的修改 还原(而只是保证了u对b数组的修改)
Ref:图上dfs需要回溯时尽量只涉及一个点的影响
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】