首页 > 其他分享 >P2585 [ZJOI2006] 三色二叉树

P2585 [ZJOI2006] 三色二叉树

时间:2024-02-07 19:44:20浏览次数:30  
标签:f1 f2 min int max P2585 二叉树 ZJOI2006 now

原题链接

总结

1.要学会动态规划这种思维方式,即定义状态和状态之间的转移
2.本题的难点在于如何将抽象的输入数据转换成树状结构处理和定义状态,这个定义状态让我想到了初中添加几何线,可能要多做题才能有感觉吧
3.有一定模拟的部分,这一部分要细心

\(Code\)

#include<bits/stdc++.h>
using namespace std;
int len=0;
string s;
int f1[500005][3]={0},f2[500005][3]={0};
void ss(int now)
{
    if(s[now]=='0')
    {
        f1[now][0]=1;
        f2[now][0]=1;
        return;
    }

    ss(++len);
    if(s[now]=='1')
    {
        f1[now][0]=max(f1[now+1][1],f1[now+1 ][2])+1;
        f1[now][1]=max(f1[now+1][0],f1[now+1][2]);
        f1[now][2]=max(f1[now+1][0],f1[now+1][1]);

        f2[now][0]=min(f2[now+1][1],f2[now+1][2])+1;
        f2[now][1]=min(f2[now+1][0],f2[now+1][2]);
        f2[now][2]=min(f2[now+1][0],f2[now+1][1]);
    }
    else
    {
        int k=len;
        ss(++len);
        f1[now][0]=max(f1[now+1][1]+f1[k+1][2],f1[now+1][2]+f1[k+1][1])+1;
        f1[now][1]=max(f1[now+1][2]+f1[k+1][0],f1[now+1][0]+f1[k+1][2]);
        f1[now][2]=max(f1[now+1][1]+f1[k+1][0],f1[now+1][0]+f1[k+1][1]);

        f2[now][0]=min(f2[now+1][1]+f2[k+1][2],f2[now+1][2]+f2[k+1][1])+1;
        f2[now][1]=min(f2[now+1][2]+f2[k+1][0],f2[now+1][0]+f2[k+1][2]);
        f2[now][2]=min(f2[now+1][1]+f2[k+1][0],f2[now+1][0]+f2[k+1][1]);
    }
}
int main()
{
    cin>>s;
    ss(len);

    cout<<max(f1[0][0],max(f1[0][1],f1[0][2]))<<" "<<min(f2[0][0],min(f2[0][1],f2[0][2]));
    return 0;
}

标签:f1,f2,min,int,max,P2585,二叉树,ZJOI2006,now
From: https://www.cnblogs.com/pure4knowledge/p/18011231

相关文章

  • (14/60)二叉树理论基础、递归遍历、迭代遍历、统一迭代
    二叉树理论基础分类满二叉树:只有度为0和度为2的结点,且度为0结点在同一层上(每一层的结点都是满的)。完全二叉树:除了底层外其他层结点都是满的(底层当然也可以是满的),且底层结点从左往右连续不断。二叉搜索树:树的每个结点满足:左子树所有结点值均小于根结点的值右子树所有......
  • 代码随想录算法训练营第十四天 | 94. 二叉树的中序遍历,144.二叉树的前序遍历,145.二叉
    145.二叉树的后序遍历 已解答简单 相关标签相关企业 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例1:输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1] 提示:树中节点......
  • 一套模板搞定二叉树算法题--二叉树算法讲解004
    1、二叉树经典习题模拟忘记知识点和技巧时,遇到一个新的二叉树习题,该如何处理思考和写代码解题?1.1、leetcode965题目和题意:题解1成员变量self.ans:题解2递归回传:1.2、leetcode257该题是个经典二叉树题目题目和题意:题解:分析,所有路径,每一个叶子节点都需要到达。到......
  • leedcode 对称二叉树
    迭代法:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defisSymmetric(self,root):......
  • leedcode 二叉树的中序遍历
    自己写的classSolution:def__init__(self):self.res_list=list()definorderTraversal(self,root):ifroot:ifroot==None:returnelse:self.inorderTraversal(root.left)......
  • 代码随想录 day37 单调递增的数字 监控二叉树
    单调递增的数字只想到暴力解法然后超时这里思路是如果从后往前发现不是递增序列那就把前一位--后一位数字变成9然后维护这个变成9的坐标遍历完后把后面的也全部变成9这个对现在的我来说太难了先贴段代码理解一下吧classSolution{intres=0;publicintminCam......
  • 二叉树的广度遍历/层序遍历
    privateInteger[]breadthSearch(TreeNoderoot){ List<Integer>list=newArrayList<Integer>();//存放节点值 ArrayDeque<TreeNode>queue=newArrayDeque<TreeNode>();//队列,用来存放节点 queue.add(root); while(!queue.isEmpty()){ TreeNo......
  • [刷题笔记] ybt 1364:二叉树遍历(flist)
    Problem_LinkDescription树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。Analysis我们先前做过给定前序......
  • 二叉树(1)
    目录110平衡二叉树257二叉树的所有路径null前面一些简单题就没放上来,放的都是一开始没思路的110平衡二叉树显然这题不能单纯的返回truefalse还需要把这一层的高度接住所以用-1作为标识符,如果=-1说明下层已经有不平衡了,那么都返回-1否则就返回这棵树的高度classSolution{......
  • 【树】二叉树的应用 I
    目录1.题目列表2.应用2.1.Leetcode226.翻转二叉树2.1.1.题目2.1.2.解题思路2.1.2.1.方法一:前序遍历2.1.2.2.方法二:后序遍历2.1.3.代码实现2.2.Leetcode116.填充每个节点的下一个右侧节点指针2.2.1.题目2.2.2.解题思路2.2.2.1.方法一:广度优先搜索2.2.2.2.方法二:深......