2017.9.24 三色二叉树 思考记录

树形dp入门题,,,,枚举转移即可、

设f【i】【0】表示这个点不是绿色

    f【i】【1】表示这个点是绿色、

由于要求是相邻和两儿子,所以枚举下面点的情况转移就可以了



码:

#include
#include
using namespace std;
#include
vectorv[100005];
int f[100005][2],g[100005][2],tot,wz=-1;
char str[100005];
void dp(int o)
{
	++wz;
	if(str[wz]=='0')
	{
		f[o][0]=g[o][0]=0;
		f[o][1]=g[o][1]=1;		
	}
	if(str[wz]=='1')
	{
		++tot;
		int lin=tot;
		dp(tot);
		f[o][0]=max(f[lin][0],f[lin][1]);
		g[o][0]=min(g[lin][0],g[lin][1]);
		f[o][1]=f[lin][0]+1;		
		g[o][1]=g[lin][0]+1;
	}
	if(str[wz]=='2')
	{
		++tot;
       int lin1=tot;
		dp(tot);
	    ++tot;
		int lin2=tot;
		dp(tot);
		f[o][0]=max(f[lin1][1]+f[lin2][0],f[lin1][0]+f[lin2][1]);	
		f[o][1]=f[lin1][0]+f[lin2][0]+1;
		g[o][0]=min(g[lin1][1]+g[lin2][0],g[lin1][0]+g[lin2][1]);	
		g[o][1]=g[lin1][0]+g[lin2][0]+1;	
    }   
}
int main()
{
	scanf("%s",str);
	dp(++tot);
	printf("%d %d",max(f[1][1],f[1][0]),min(g[1][1],g[1][0]));
}


你可能感兴趣的:(题目)