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;
}

浙公网安备 33010602011771号