程序员面试金典: 9.9 递归和动态规划 9.11求布尔表达式的表达个数

本文介绍了如何使用递归和动态规划(实际上是记忆化搜索+递归)解决布尔表达式的括号放置问题,以达到特定布尔结果。通过对表达式进行拆分和等价转换,计算不同括号方案的数量。例如,对于表达式1^0|0|1,当结果为true时,存在3种不同的括号放置方法使其结果为true。
摘要由CSDN通过智能技术生成
#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
	 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值