点击跳转例题
思路:
我们以当前节点为例,它能贡献的长度就是它的儿子的个数和每个儿子贡献的最大值,所以我们需要知道哪个儿子贡献最多。
这个过程可以用搜索。返回值为当前节点的"左儿子,右兄弟“表示法的最大深度。
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' using namespace std; vector<int>g[100005]; int dfs(int x) { int mx=0; for(auto i:g[x]) { mx=max(mx,dfs(i)); } return mx+g[x].size(); } signed main() { int n;cin>>n; for(int i=2;i<=n;i++) { int x;cin>>x; g[x].push_back(i); } cout<<dfs(1)<<endl; return 0; }
当然,这个思路也符合最优子结构,且有后效性。所以也是树上dp:
#include <bits/stdc++.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl '\n' using namespace std; int f[100005]; vector<int>g[100005]; //f[i]表示i 为根的子树能够形成的最大深度。 void dfs(int x) { for(auto i:g[x]) { dfs(i); //最大儿子构造。 f[x]=max(f[x],f[i]); } //加上兄弟构造 f[x]+=g[x].size(); return ; } signed main() { int n;cin>>n; for(int i=2;i<=n;i++) { int x;cin>>x; g[x].push_back(i); } dfs(1); cout<<f[1]<<endl; return 0; }
P8744 [蓝桥杯 2021 省 A] 左孩子右兄弟--2024蓝桥杯冲刺省一
最新推荐文章于 2024-11-08 11:06:20 发布