zoukankan      html  css  js  c++  java
  • [ZJOI2006] 三色二叉树

    [ZJOI2006] 三色二叉树

    题目大意:给一个用形如(1122002010)的字符串表示的二叉树,每个数字代表有几个结点,紧跟的就是她的左右儿子的信息.现在可以将一个结点染成红,蓝,绿三色,一个点和它子节点的颜色必须不同,同一个父亲的子节点的颜色也必须不同,求可以染成绿色结点的最多和最少数目

    要想生活过的去,就得头上带点绿

    这样来DP

    • 建树很轻松,只需要保存左右儿子结点的编号就好
    • 状态:(f[i][j])表示第(i)个结点染上(j)色后她和她子树内的绿色结点数目,(g[i][j])反之
    • 转移方程:选哪个颜色就加上左右儿子的可能颜色的数目,如果染成绿色,就再(+1)
    • 初始化:注意(g[0][0]=g[0][1]=g[0][2]=0)且其他值都设为(INF)

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using std::max;
    using std::min;
    
    const int N = 500005;
    
    char s[N];
    int ch[N][3], f[N][3], g[N][3];
    int cnt = 1, ans, ans2 = 2147483640;
    
    void build(int x){
        for(int i = 1; i <= s[x] - '0'; ++i){
            ch[x][i] = ++cnt;
            build(cnt);
        }
    }//建树
    
    void dfs(int x){
        if(x == 0)return;
        int ch1= ch[x][1], ch2 = ch[x][2];
        dfs(ch1);
        dfs(ch2);
        f[x][0] = max(f[x][0], f[ch1][1] + f[ch2][2] + 1);
        f[x][0] = max(f[x][0], f[ch1][2] + f[ch2][1] + 1);
        f[x][1] = max(f[x][1], f[ch1][0] + f[ch2][2]);
        f[x][1] = max(f[x][1], f[ch1][2] + f[ch2][0]);
        f[x][2] = max(f[x][2], f[ch1][1] + f[ch2][0]);
        f[x][2] = max(f[x][2], f[ch1][0] + f[ch2][1]);
    
        g[x][0] = min(g[x][0], g[ch1][1] + g[ch2][2] + 1);
        g[x][0] = min(g[x][0], g[ch1][2] + g[ch2][1] + 1);
        g[x][1] = min(g[x][1], g[ch1][0] + g[ch2][2]);
        g[x][1] = min(g[x][1], g[ch1][2] + g[ch2][0]);
        g[x][2] = min(g[x][2], g[ch1][1] + g[ch2][0]);
        g[x][2] = min(g[x][2], g[ch1][0] + g[ch2][1]);
    } 
    
    int main(){
        scanf("%s", s + 1);
        build(1);
        memset(g, 0x3f, sizeof(g));
        g[0][1] = g[0][2] = g[0][0] = 0;
        dfs(1);
        for(int i = 0; i <= 2; ++i)
            ans = max(f[1][i], ans);
        for(int i = 0; i <= 2; ++i)
            ans2 = min(g[1][i], ans2);
        printf("%d %d", ans, ans2);
        return 0;
    }
    
  • 相关阅读:
    Java连接Elasticsearch
    使用EasyPoi导出Excel
    递归遍历组织机构树
    打算用mongodb mapreduce之前一定要知道的事!!!
    css 手机禁止页面拖动
    js各种验证代码
    async nodejs
    防止在iOS设备中的Safari将数字识别为电话号码
    SQL中char、varchar、nvarchar的区别
    双击事件阻止点击事件
  • 原文地址:https://www.cnblogs.com/LMSH7/p/9531833.html
Copyright © 2011-2022 走看看