题解 | #小红的树#带缓存的递归vs循环法

小红的树

https://www.nowcoder.com/practice/66ab364d3fba487eb39bd3460fd484c0

题目的输入用的节点,目标是遍历节点,所以链表用邻接表(拉链表)存储

带缓存的递归

循环法

性能差别还蛮明显的

#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int calc(const int& node, const vector<deque<int>> &children,vector<int>& dp,const string& colored){
    if(dp[node]>=0)return dp[node];
    dp[node]=0;
    if(colored[node]=='R') dp[node]++;
    for(int i=0;i<children[node].size();++i){
         dp[node]+=calc(children[node][i],children,dp,colored);
    }
    return dp[node];
}

int main() {
    int n,t,i,curNode,result;
    cin>>n;
    vector<int> dp(n,-1);
    vector<deque<int>> children(n,deque<int>());
    for(i=1;i<n;++i){
        cin>>t;
        t--;
        children[t].push_back(i);
    }
    string colored;
    cin>>colored>>t;//询问次数可扔掉。
    while(cin>>t){
        t--;//编号转下标
        cout<<calc(t,children,dp,colored)<<endl;
 
    }
 
}

#include <iostream>
#include <vector>
#include <deque>
using namespace std;
 
int main() {
    int n,t,i,curNode,result;
    cin>>n;
    vector<int> dp(n,0);
    vector<int> parent(n);
    for(i=1;i<n;++i){
        cin>>t;
        parent[i]=t-1;
    }
    string colored;
    cin>>colored>>t;//询问次数可扔掉。
    parent[0]=-1;
    for(i=0;i<n;++i){
        if(colored[i]=='W')continue;
        t=i;
        while(t>=0){
            dp[t]++;
            t=parent[t];
        }
    }
 
    while(cin>>t){
        t--;//编号转下标
        cout<<dp[t]<<endl;
  
    }
}

#通信硬件薪资爆料#
全部评论

相关推荐

能干的三文鱼刷了10...:公司可能有弄嵌入式需要会画pcb的需求,而且pcb能快速直观看出一个人某方面的实力。看看是否有面试资格。问你问题也能ai出来,pcb这东西能作假概率不高
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务