zoukankan      html  css  js  c++  java
  • BZOJ 1864 三色二叉树

    分颜色dp一下就行了。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxv 500500
    #define maxe 1000050
    #define inf 2000000000
    using namespace std;
    char s[maxv];
    int n,f[maxv][4][3],now=1,ls[maxv],rs[maxv];
    void dfs1(int x)
    {
        now=x;
        if (s[x-1]=='0') return;
        ls[x]=now+1;dfs1(x+1);
        if (s[x-1]=='2') {rs[x]=now+1;dfs1(now+1);}
    }
    void dfs2(int x)
    {
        if (ls[x]) dfs2(ls[x]);
        if (rs[x]) dfs2(rs[x]);
        f[x][1][1]=max(f[ls[x]][2][1]+f[rs[x]][3][1],f[ls[x]][3][1]+f[rs[x]][2][1])+1;
        f[x][1][2]=min(f[ls[x]][2][2]+f[rs[x]][3][2],f[ls[x]][3][2]+f[rs[x]][2][2])+1;
        f[x][2][1]=max(f[ls[x]][1][1]+f[rs[x]][3][1],f[ls[x]][3][1]+f[rs[x]][1][1]);
        f[x][2][2]=min(f[ls[x]][1][2]+f[rs[x]][3][2],f[ls[x]][3][2]+f[rs[x]][1][2]);
        f[x][3][1]=max(f[ls[x]][1][1]+f[rs[x]][2][1],f[ls[x]][2][1]+f[rs[x]][1][1]);
        f[x][3][2]=min(f[ls[x]][1][2]+f[rs[x]][2][2],f[ls[x]][2][2]+f[rs[x]][1][2]);
    }
    void build()
    {
        n=strlen(s);
        dfs1(1);
    }
    int main()
    {
        scanf("%s",s);
        build();    
        dfs2(1);
        int ans1=0,ans2=inf;
        for (int i=1;i<=3;i++)
        {
            ans1=max(ans1,f[1][i][1]);
            ans2=min(ans2,f[1][i][2]);
        }
        printf("%d %d
    ",ans1,ans2);
        return 0;
    }
  • 相关阅读:
    Android studio中Terminal中使用git(Windows环境)
    快速将JSON转换为bean
    生成apk文件
    Intent显式和隐式使用
    碎片
    ListView的基本用法
    浅谈JSONObject,GSON解析JSON
    浅谈SAX,PULL解析XML
    iOS源代码管理工具
    详解tintColor属性
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6015686.html
Copyright © 2011-2022 走看看