P2585 三色二叉树(树上 DP)

写这题唯一目的是温习一下半吊子中序排列。

#include<bits/stdc++.h>
using namespace std;
const int N=500009;
char S[N];
int cnt=-1,dp[N][3],Dp[N][3];
int dfs(){
    int u=++cnt,ls,rs;
    for(int i=0;i<3;i++) dp[u][i]=N;
    if(S[u]=='0') for(int i=0;i<3;i++) Dp[u][i]=dp[u][i]=(i==0);
    else if(S[u]=='1'){
        ls=dfs();
        for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(i!=j){
            dp[u][i]=min(dp[u][i],(i==0)+dp[ls][j]);
            Dp[u][i]=max(Dp[u][i],(i==0)+Dp[ls][j]);
        }
    }else{
        ls=dfs(),rs=dfs();
        for(int i=0;i<3;i++) for(int j=0;j<3;j++)
        for(int k=0;k<3;k++) if(i!=j&&j!=k&&i!=k){
            dp[u][i]=min(dp[u][i],(i==0)+dp[ls][j]+dp[rs][k]);
            Dp[u][i]=max(Dp[u][i],(i==0)+Dp[ls][j]+Dp[rs][k]);
        }
    }
    return u;
}
int main(){
    scanf("%s",S),dfs();
    printf("%d ",max(max(Dp[0][0],Dp[0][1]),Dp[0][2]));
    printf("%d",min(min(dp[0][0],dp[0][1]),dp[0][2]));
    return 0;
}
posted @ 2026-02-21 22:56  2025ing  阅读(1)  评论(0)    收藏  举报