#include <iostream>
#include <stdio.h>
#include <string>
#include <map>
#include <sstream>
using namespace std;
/*
问题:给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的方法可使该
表达式得出result值。
分析:书上解法,采用以符号作为分割,符号左边和符号右边分别加表达式的方式进行计算。
比如表达式为: 1^0|0|1,
以第一个符号"^"拆分为 1^(0|0|1)
二 (1^0)|(0|1)
....
最关键的就是进行表达式等价转换:假设表达式为exp,拆分为左右表达式我exp1,exp2,
设f(exp1|exp2 , result)为表达式f(exp,result)是表达式exp符合result的结果集个数
当result=true时,
与运算为true,则exp1和exp2必须都为true
f(exp1 & exp2 , true) = f(exp1 ,true) * f(exp2 , true) 【1】
或运算为true,分三种情况:两个都为true,exp1为true且exp2为false,exp1为false且exp2位true
f(exp1 | exp2 , true) = f(exp1 , true) * f(exp2,true)+f(exp1, true)*f(exp2,false)+f(exp1,false)*f(exp2,true)【2】
异或运算为true,必定一个为true,一个为false
程序员面试金典: 9.9 递归和动态规划 9.11求布尔表达式的表达个数
最新推荐文章于 2022-03-01 13:56:47 发布
本文介绍了如何使用递归和动态规划(实际上是记忆化搜索+递归)解决布尔表达式的括号放置问题,以达到特定布尔结果。通过对表达式进行拆分和等价转换,计算不同括号方案的数量。例如,对于表达式1^0|0|1,当结果为true时,存在3种不同的括号放置方法使其结果为true。
摘要由CSDN通过智能技术生成