hihocoder217周 树形DP
题目链接
一棵树,树中包含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();
}
}
hihocoder217周 树形DP的更多相关文章
- 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛 树形dp
题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ...
- 【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] ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
随机推荐
- html5各种页面切换效果和模态对话框
页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop ...
- IOS开发之自定义UITabBarController
UITabBarController是开发中经常会用到的一个视图控制器,但是默认的UITabBarController经常不能够完全满足我们的需求,所以我们经常需要自定义一个UITabBarContr ...
- Java-JUC(八):使用wait,notify|notifyAll完成生产者消费者通信,虚假唤醒(Spurious Wakeups)问题出现场景,及问题解决方案。
模拟通过线程实现消费者和订阅者模式: 首先,定义一个店员:店员包含进货.卖货方法:其次,定义一个生产者,生产者负责给店员生产产品:再者,定义一个消费者,消费者负责从店员那里消费产品. 店员: /** ...
- how to restrict copy paste in a Textbox, in MFC?
[问题] I am developing a small application in MFC... there is a little problem..hope you guys would he ...
- Javascript中变量函数申明优先级
先理解这句话: “函数会首先被提升,然后才是变量”,代码并不是你写的顺序那样执行的. F12把下面的代码粘贴到控制台执行一下: var getName = function () { console. ...
- 【Nodejs】使用http.request批量下载MP3,发现网络文件大于1000K时下载文件为0K
这又一次让我对http.request产生质疑 //====================================================== // 喜爱123四年级上英语MP3下载 ...
- OpenStack云计算之路-Mitaka 版本
1.1 云计算简介 云计算(英语:cloud computing ),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给计算机各种终端和其他设备. 云计算是继1980年代 ...
- tomcat重启后session没有清除的解决办法
tomcat的默认设置是:用户保存的session信息会持久到到硬盘中,即使重启tomcat,这些session信息也不会丢失. 如果希望重启tomcat,清除所有session信息,可以修改tomc ...
- uni-app - 支付(app支付、小程序支付、h5(微信端)支付)
App支付.小程序支付.h5(微信端)支付 APP支付(内置) appPay.js /** * 5+App支付,仅支持支付宝以及微信支付 * * 支付宝Sdk集成,微信sdk未集成 * * @para ...
- Linux清理Buffer/Cache内存空间让系统变流畅
释放缓存区内存的方法 a)清理pagecache(页面缓存) # echo 1 > /proc/sys/vm/drop_caches 或者 # sysctl -w vm.drop_ ...