题目的输入用的节点,目标是遍历节点,所以链表用邻接表(拉链表)存储
带缓存的递归
循环法
性能差别还蛮明显的
#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; } }