题解 | #小红的树#带缓存的递归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;
  
    }
}

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

相关推荐

暴走萝莉莉:这是社招场吧,作为HR说个实话:这个维护关系的意思是要有政府资源,在曾经的工作中通过人脉资源拿下过大订单的意思。这个有相关管理经验,意思也是真的要有同岗位经验。应酬什么的对于业务成交来说就算不乐意也是常态,就是要求说话好听情商高,酒量好。
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务