题目链接

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

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

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

思路

只考虑当前结点和它的儿子。

要想改变当前结点的值,有两种方法:

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

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

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Scanner;
  4. public class Main {
  5. final int MAX_VLUE = 100000;
  6. class Node {
  7. List<Node> son = new ArrayList<>();
  8. String value;
  9. int parent;
  10. int reverseValue = -1;
  11. boolean nowValue = false;
  12. boolean inited = false;
  13. Node(String value, int parent) {
  14. this.value = value;
  15. this.parent = parent;
  16. }
  17. int reverseOne(boolean toValue) {
  18. int min = MAX_VLUE;
  19. for (Node i : son) {
  20. if (i.getValue() == toValue) return 0;
  21. min = Math.min(min, i.reverse());
  22. }
  23. return min;
  24. }
  25. int reverseAll(boolean toValue) {
  26. int s = 0;
  27. for (Node i : son) {
  28. if (i.getValue() != toValue) {
  29. s += i.reverse();
  30. }
  31. }
  32. return s;
  33. }
  34. //翻转需要的步数
  35. int reverse() {
  36. if (reverseValue != -1) return reverseValue;
  37. if (value.equals("TRUE") || value.equals("FALSE")) return MAX_VLUE;
  38. if (value.equals("AND")) {
  39. if (nowValue) {
  40. reverseValue = Math.min(reverseOne(false), 1 + reverseAll(false));
  41. } else {
  42. reverseValue = Math.min(reverseAll(true), 1 + reverseOne(true));
  43. }
  44. } else if (value.equals("OR")) {
  45. if (nowValue) {
  46. reverseValue = Math.min(1 + reverseOne(false), reverseAll(false));
  47. } else {
  48. reverseValue = Math.min(reverseOne(true), 1 + reverseAll(true));
  49. }
  50. }
  51. return reverseValue;
  52. }
  53. boolean getValue() {
  54. if (inited) return nowValue;
  55. inited = true;
  56. if (value.equals("TRUE")) {
  57. nowValue = true;
  58. return true;
  59. } else if (value.equals("FALSE")) {
  60. nowValue = false;
  61. return false;
  62. } else if (value.equals("AND")) {
  63. nowValue = son.stream().allMatch(Node::getValue);
  64. return nowValue;
  65. } else if (value.equals("OR")) {
  66. nowValue = son.stream().anyMatch(Node::getValue);
  67. return nowValue;
  68. }
  69. return false;
  70. }
  71. }
  72. Main() {
  73. Scanner cin = new Scanner(System.in);
  74. int N = cin.nextInt();
  75. Node[] a = new Node[N + 1];
  76. a[0] = new Node("AND", 0);
  77. for (int i = 1; i <= N; i++) {
  78. int parent = cin.nextInt();
  79. String value = cin.next();
  80. a[i] = new Node(value, parent);
  81. }
  82. int root = 1;
  83. for (int i = 1; i <= N; i++) {
  84. a[a[i].parent].son.add(a[i]);
  85. if (a[i].parent == 0) {
  86. root = i;
  87. }
  88. }
  89. a[root].getValue();
  90. int step = a[root].reverse();
  91. if (step >= MAX_VLUE) {
  92. System.out.println(-1);
  93. } else {
  94. System.out.println(step);
  95. }
  96. }
  97. public static void main(String[] args) {
  98. new Main();
  99. }
  100. }

hihocoder217周 树形DP的更多相关文章

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

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

  2. 【BZOJ】2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛(树形dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2060 裸的树形dp d[x][1]表示访问x的数量,d[x][0]表示不访问x的数量 d[x][1] ...

  3. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  4. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  5. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  6. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  7. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  8. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  9. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

随机推荐

  1. Add Binary Leetcode java

    题目: Given two binary strings, return their sum (also a binary string). For example, a = "11&quo ...

  2. Valid Sudoku leetcode java

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  3. Ubuntu升级到18.04

    1.更新 sudo apt-get update 2.升级 sudo apt-get upgrade 3.检测最新版本 sudo update-manager -c -d 然后就会弹出窗口,提示ubu ...

  4. Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进 等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc.在启动vim时,当前用户 ...

  5. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  6. RocketMQ【未完成】

    RocketMQ 是一款快速地.可靠地.分布式.容易使用的消息中间件,由 alibaba 开发,其前身是 metaq,metaq 的第一个版本是可以看成是linkedin的kafka(scala)的j ...

  7. Android LazyList 从网络获取图片并缓存

    原演示地址 本文内容 环境 演示 LazyList 从网络获取图片并缓存 参考资料 本文是 Github 上的一个演示,通过网络获取歌手专辑的缩略图,并显示在 ListView 控件中.该演示具备将缩 ...

  8. tomcat7部署多个web应用不同编码,端口

    1个tomcat部署多个web应用可以设置不同编码,端口,server.xml配置如下: <?xml version='1.0' encoding='utf-8'?><Server ...

  9. Mysql数据库常用分库和分表方式

    http://blog.csdn.net/clevercode/article/details/50877580 1 分库 1.1 按照功能分库 按照功能进行分库.常见的分成6大库:    1 用户类 ...

  10. C#学习记录二:高级数据存储方式

    1,结构 结构和类的区别主要在于存储和访问方式,结构是一种值 数据类型,而类是一一种引用数据类型.所谓值数据类型存储个人理解是存在堆里面的,所谓引用数据类型存储在了栈里面,相当于存储了一个指针. 结构 ...