直接树形DP
我的代码好长啊。。。。。。
我已开始还很疑惑到底应该怎么通过一个字符串建树,原来这么水,直接dfs下去就行了
下面是代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define MAX 300010
using namespace std;
int jiyi1[MAX][2];
int jiyi2[MAX][2];
int l[MAX],r[MAX];
int treesize=1;
inline void read(int now){
char ch=getchar();
if (ch=='0')return;
treesize++;l[now]=treesize;read(treesize);
if (ch=='2'){
treesize++;
r[now]=treesize;
read(treesize);
}
}
int dp1(int now,int z){
int& fanhui=jiyi1[now][z];
if(fanhui!=-1){
return fanhui;
}else{
if(l[now]==0&&r[now]==0){
fanhui=0;
}else{
if(l[now]!=0&&r[now]!=0){
if(z==1){
fanhui=dp1(l[now],0)+dp1(r[now],0);
}else{
fanhui=dp1(l[now],1)+dp1(r[now],0)+1;
fanhui=max(fanhui,dp1(l[now],0)+dp1(r[now],1)+1);
fanhui=max(fanhui,dp1(l[now],0)+dp1(r[now],0));
}
}else{
if(z==1){
fanhui=dp1(l[now],0);
}else{
fanhui=dp1(l[now],1)+1;
fanhui=max(fanhui,dp1(l[now],0));
}
}
}
}
return fanhui;
}
int dp2(int now,int z){
int& fanhui=jiyi2[now][z];
if(fanhui!=-1){
return fanhui;
}else{
if(l[now]==0&&r[now]==0){
fanhui=0;
}else{
if(l[now]!=0&&r[now]!=0){
if(z==1){
fanhui=dp2(l[now],0)+dp2(r[now],0);
}else{
fanhui=dp2(l[now],1)+dp2(r[now],0)+1;
fanhui=min(fanhui,dp2(l[now],0)+dp2(r[now],1)+1);
}
}else{
if(z==1){
fanhui=dp2(l[now],0);
}else{
fanhui=dp2(l[now],1)+1;
fanhui=min(fanhui,dp2(l[now],0));
}
}
}
}
return fanhui;
}
int main(){
read(1);
for(int i=0;i<=treesize+1;i++){
jiyi1[i][0]=-1;
jiyi1[i][1]=-1;
jiyi2[i][0]=-1;
jiyi2[i][1]=-1;
}
cout<<max(dp1(1,0),dp1(1,1)+1)<<" ";
cout<<min(dp2(1,0),dp2(1,1)+1)<<endl;
return 0;
}