题目描述:
有 n 个点排成一排,第 i 个点都有一个分数 ai
一个人从 1 号点出发,要走到 n 号点。当这个人在 i点时时,这个人可以选择走到i+1点,也可以跳到ti点
假如这个人的得分就是一路上路过的所有点上分数之和,请问应该如何安排行动,才能使获得的分数之和达到最高?
输入格式:
第一行为正整数 n(1≤n≤105)
第二行为n 个整数,ai表示i号点的分数(−105≤ai≤105)
第三行为n−1个整数,ti表示i点可以跳到的地方(i<ti≤n)
输出格式:
输出一个整数,表示可能拿到的最高分数
样例输入:
3
4 -2 6
3 3
样例输出:
10
以下为我的代码
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int a[200005],t[200005];
struct step{
int place,num;
};
void bfs(int start){
queue<step> b;
b.push((step){start,a[start]});
while(!b.empty()){
int st=b.front().place;
int point=b.front().num;
b.pop();
if(st==n){
ans=max(ans,point);
}
else{
b.push((step){st+1,point+a[st+1]});
b.push((step){t[st],point+a[t[st]]});
}
}
}
int main(){
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
cin>>t[i];
}
bfs(1);
cout<<ans;
return 0;
}
虽然样例过了
但是70都是运行超时(应该是TLE的意思)
想看一下代码里面为什么错了