*/
两种方法:
方法一:
/**
* 思路:迭代整个表达式,将每个运算符当作第一个要加括号的运算符。
* @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值
原文地址:http://blog.csdn.net/shangqing1123/article/details/47663091