9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
来源:互联网 发布:开眼软件下载 编辑:程序博客网 时间:2024/06/05 16:46
/**
* 攻略:给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式
* 得出result值。
* 攻略:给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式
* 得出result值。
*/
两种方法:
方法一:
/** * 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符。 * @param exp * @param result * @param s:start * @param e:end * @return */public static int f(String exp,boolean result,int s,int e){if(s==e){if(exp.charAt(s)=='1'&&result)return 1;if(exp.charAt(s)=='0'&&!result)return 1;return 0;}int c=0;if(result){for(int i=s+1;i<=e;i+=2){if(exp.charAt(i)=='&'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);}else if(exp.charAt(i)=='|'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='^'){c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);}}}else{for(int i=s+1;i<=e;i+=2){if(exp.charAt(i)=='&'){c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='|'){c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='^'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}}}return c;}
方法二:
//动态规划/** * 思路:缓存不同表达式的结果,避免多次用到同一个exp的值时需要重算。对expression和result进行缓存。 * @param exp * @param result * @param s * @param e * @param map * @return */public static int ff(String exp,boolean result,int s,int e,HashMap<String,Integer> map){String key=""+result+s+e;//注意加""的位置,应加在前面,表示为字符串的拼接。否则,则表示值先相加,再转字符串if(map.containsKey(key))return map.get(key);int c=0;if(result){for(int i=s+1;i<=e;i+=2){if(exp.charAt(i)=='&'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);}else if(exp.charAt(i)=='|'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='^'){c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);}}}else{for(int i=s+1;i<=e;i+=2){if(exp.charAt(i)=='&'){c+=f(exp,true,s,i-1)*f(exp,false,i+1,e);c+=f(exp,false,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='|'){c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}else if(exp.charAt(i)=='^'){c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);}}}map.put(key, c);return c;}
0 0
- 9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
- 实现一个函数,算出有几种括号的放法可使该表达式得出result值
- 9.9递归和动态规划(六)——打印n对括号的全部有效组合(即左右括号正确配对)
- 9.9递归和动态规划(一)——小孩上楼梯的方式的种类
- 9.9递归和动态规划(四)——返回某集合的所有子集
- 9.9递归和动态规划(五)——确定某字符串的所有排列组合
- 程序员面试金典: 9.9 递归和动态规划 9.6打印n对括号的全部有效组合
- 程序员面试金典: 9.9 递归和动态规划 9.11求布尔表达式的表达个数
- NYOJ-15 括号匹配(二) 动态规划 递归
- 输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。
- 9.9递归和动态规划(七)——实现许多图片编辑软件都支持的“填充颜色”功能
- 9.9递归和动态规划(三)——魔术索引
- 9.9递归和动态规划(九)——N皇后
- 9.9递归和动态规划(十)——堆箱子
- 9.9递归和动态规划(十二)——小鸡吃米
- 动态规划和递归
- 递归和动态规划
- 动态规划和递归
- 播放器(一)-FFMPEG-SDL-MFC-本地文件
- 关于Apache的日志
- 树结构练习——排序二叉树的中序遍历
- C++多态的实现原理
- Josephus环
- 9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
- CodeForces-570B Simple Game
- 成长
- 完美解决textarea输入框提示文字,必须添加默认内容
- 2015.08.14这一天,canopen 从站终于porting 有突破,可以与主站正常连接!!
- Android 一个app启动另一个app
- markdown插入图片
- Linux中yum和apt-get用法及区别
- 通过eclipse查看、阅读hadoop2.4源码