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

实现一个函数,算出有几种括号的放法可使该表达式得出result值

时间:2015-08-31 17:23:01      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

技术分享技术分享

        至此,要解决这个问题,只需反复套用这些递归关系即可。(注意:为了避免代码行不必要的回绕,以及确保代码的可读性,下面的代码使用了非常短的变量名。)

public int f(String exp,boolean result,int s,int e)
{
if(s==e)
{
if(exp.charAt(s)==‘1‘ && result)
{
return 1;
}else if(exp.charAt(s)==‘0‘&& !result)
{
return 1;
}
return 0;
}
int c=0;
if(result)
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op ==‘&‘)
c+=f(exp,true,s,i-1)*f(exp,true,i+1,e);
else if(op==‘|‘)
{
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,true,s,i-1)*f(exp,true,i+1,e);

}else if(op ==‘^‘)
{
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)
{
char op=exp.charAt(i);
if(op==‘&‘)
{
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);
c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
}else if(op == ‘|‘)
{
c+=f(exp,false,s,i-1)*f(exp,false,i+1,e);
}
else if(op==‘^‘)
{
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;
}

技术分享

 public int f(String exp,boolean result,int s,int e,HashMap<String,Integer> q)
 {
String key=""+result+s+e;
if(q.containsKey(key))
{
return q.get(key);
}
if(s==e)
{
if(exp.charAt(s)==‘1‘&&result==true)
{
return 1;
}else if(exp.charAt(s)==‘0‘&& result==false)
{
return 1;
}
return 0;
}
int c=0;
if(result)
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op ==‘&‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op == ‘|‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op ==‘^‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
}
}
}
else
{
for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op ==‘&‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);

}else if(op == ‘|‘)
{
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
}else if(op ==‘^‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
}
}
}
q.put(key,c);
return c;
 }

技术分享

 public int f(String exp,boolean result,int s,int e,HashMap<String,Integer> q)
{
String key=""+result+s+e;
int c=0;
if(!q.containsKey(key))
{
if(s==e)
{
if(exp.charAt(s)==‘1‘) c=1;
else 
c=0;
}

for(int i=s+1;i<=e;i+=2)
{
char op=exp.charAt(i);
if(op ==‘&‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,true,i+1,e,q);
}else if(op == ‘|‘)
{
int left_ops=(i-1-s)/2;//括号在左边
int right_ops=(e-i-1)/2;//括号在右边
int total_ways=total(left_ops)*total(right_ops);
int total_false=f(exp,false,s,i-1,q)*f(exp,false,i+1,e,q);
  c+=total_ways-total_false;
}else if(op ==‘^‘)
{
c+=f(exp,true,s,i-1,q)*f(exp,false,i+1,e,q);
c+=f(exp,false,s,i-1,q)*f(exp,true,i+1,e,q);
}
}
q.put(key,c);
}
else
{
c=q.get(key);
}
if(result)
{
return c;
}
else
{
int num_ops=(e-s)/2;
return total(num_ops);
}


}


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

实现一个函数,算出有几种括号的放法可使该表达式得出result值

标签:

原文地址:http://blog.csdn.net/wangfengfan1/article/details/48134927

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