题目链接
一棵树,树中包含TRUE、FALSE、AND、OR四种结点,其中TRUE和FALSE是叶子结点,AND和OR结点的儿子包含多个结点,现在要求执行最少次数的以下操作:

  • 把AND变成OR
  • 把OR变成AND

使得整棵树的bool值结果翻转。

思路

只考虑当前结点和它的儿子。
要想改变当前结点的值,有两种方法:

  • 改变当前结点的操作
  • 改变当前结点的儿子结点的值

有时甚至需要把这两种方法结合起来,比如:当前结点为AND,它的儿子们全为TRUE。这是要改变当前结点的值,可能要把当前结点改为OR,并且把某个儿子改为FALSE。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {
final int MAX_VLUE = 100000;class Node {List<Node> son = new ArrayList<>();String value;int parent;int reverseValue = -1;boolean nowValue = false;boolean inited = false;Node(String value, int parent) {this.value = value;this.parent = parent;}int reverseOne(boolean toValue) {int min = MAX_VLUE;for (Node i : son) {if (i.getValue() == toValue) return 0;min = Math.min(min, i.reverse());}return min;}int reverseAll(boolean toValue) {int s = 0;for (Node i : son) {if (i.getValue() != toValue) {s += i.reverse();}}return s;}//翻转需要的步数int reverse() {if (reverseValue != -1) return reverseValue;if (value.equals("TRUE") || value.equals("FALSE")) return MAX_VLUE;if (value.equals("AND")) {if (nowValue) {reverseValue = Math.min(reverseOne(false), 1 + reverseAll(false));} else {reverseValue = Math.min(reverseAll(true), 1 + reverseOne(true));}} else if (value.equals("OR")) {if (nowValue) {reverseValue = Math.min(1 + reverseOne(false), reverseAll(false));} else {reverseValue = Math.min(reverseOne(true), 1 + reverseAll(true));}}return reverseValue;}boolean getValue() {if (inited) return nowValue;inited = true;if (value.equals("TRUE")) {nowValue = true;return true;} else if (value.equals("FALSE")) {nowValue = false;return false;} else if (value.equals("AND")) {nowValue = son.stream().allMatch(Node::getValue);return nowValue;} else if (value.equals("OR")) {nowValue = son.stream().anyMatch(Node::getValue);return nowValue;}return false;}
}Main() {Scanner cin = new Scanner(System.in);int N = cin.nextInt();Node[] a = new Node[N + 1];a[0] = new Node("AND", 0);for (int i = 1; i <= N; i++) {int parent = cin.nextInt();String value = cin.next();a[i] = new Node(value, parent);}int root = 1;for (int i = 1; i <= N; i++) {a[a[i].parent].son.add(a[i]);if (a[i].parent == 0) {root = i;}}a[root].getValue();int step = a[root].reverse();if (step >= MAX_VLUE) {System.out.println(-1);} else {System.out.println(step);}
}public static void main(String[] args) {new Main();
}
}

转载于:https://www.cnblogs.com/weiyinfu/p/9556492.html

hihocoder217周 树形DP相关推荐

  1. 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛 树形dp

    题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ...

  2. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  3. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  4. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  5. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  6. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  7. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  8. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  9. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

最新文章

  1. 增强for循环对于“二维”数组进行循环的案例
  2. 何谓程序员?何谓中国的程序员?
  3. 高盛发布区块链报告:从理论到实践(中文版)
  4. 从字节码角度解释i++和++i
  5. [Java] Hashmap分析
  6. JavaScript自动设置IFrame高度(兼容各主流浏览器)
  7. Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签
  8. AI学习笔记(二)图像与视频
  9. python撤回快捷键大全_Python 快捷键大全
  10. 这篇文章,自带背景音乐。因为它来自1993年!
  11. Word编辑公式的快捷键与命令
  12. java xms xmn_java堆内存JVM属性调优总结(-Xms -Xmx -Xmn -Xss)
  13. 一个屌丝程序猿的人生(四十二)
  14. 2015中考计算机考试时间,2015中考时间安排
  15. 计算机发展的各个阶段是以什么作为标志的,计算机发展的各个阶段是以什么作为标志的?...
  16. 167. 两数之和 II - 输入有序数组633. 平方数之和
  17. Mtk WIFI常用调试命令
  18. 摄像头模组简介与质量管控(连载三)
  19. Excel 2010 VBA 入门 014 获取VBA帮助
  20. 同时操作(All-At-Once Operation)

热门文章

  1. 前端调数据会经常用到的事件处理
  2. js 的push方法
  3. 跑步与读书都废掉了...工作目前也在换新的.
  4. JavaBean在jsp中的使用
  5. 想悄悄的做渗透测试?这里的工具足够你用了
  6. Windows域策略 设置客户端服务启动状态 【全域策略生效】
  7. 办公室海王小姐姐悄悄问我如何在PC端登录多个微信小号?
  8. java classnotfoundexception e_关于解释class文件时出现java.lang.ClassNotFoundException的问题...
  9. access mysql 操作方法_操作ACCESS数据库注意事项
  10. 详解3种常用数据分析方法,满足你职场95%的高频需求