科大讯飞笔试第三批 第三题补题

树上DP,就说求以根节点出发的最长节点值非减的深度+次长节点值非减的深度,能够构成一个链。非增同理

有向图+记忆化搜索dfs

做题的时候结果读取逻辑写乱了,最后没通过,还得练

#include <iostream>
#include <vector>
#include <cmath>
#include<string.h>
using namespace std;
const int M=1e5+5;
#define lld long long int

int n,v[M],dp[M];
vector<int> to[M];

int dfs(int x){
    if(dp[x]!=-1)return dp[x];
    int cur=0;
    for(int j: to[x]){
        if(v[x]<=v[j]){
            cur=max(cur,dfs(j));
            cout<<"dp"<<j<<"--"<<endl;
        }
    }
    return dp[x]=cur+1;
}


int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>v[i];
    for(int i=1;i<n;i++){
        int a,b;
        cin>>a>>b;
        to[a].push_back(b);
    }
    memset(dp,-1,sizeof(dp));
    lld ans=0,m1=0,m2=0;
    dfs(1);
    for(int i=1;i<=n;i++)cout<<"dp"<<i<<"="<<dp[i]<<endl;
    for(int j: to[1]){
        lld now_m=dp[j];
        if(now_m>m1)m2=m1,m1=now_m;
        else if(now_m>m2)m2=now_m;
    }
    ans=m1+m2+1;
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2024-08-05 13:33  GeraldG  阅读(21)  评论(0编辑  收藏  举报