码迷,mamicode.com
首页 > 其他好文 > 详细

9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值

时间:2015-08-14 17:12:52      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:java   递归   动态规划   算法   数学   

/**
 * 攻略:给定一个布尔表达式,由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;	
		
	}


版权声明:本文为博主原创文章,未经博主允许不得转载。

9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值

标签:java   递归   动态规划   算法   数学   

原文地址:http://blog.csdn.net/shangqing1123/article/details/47663091

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!