实现一个函数,算出有几种括号的放法可使该表达式得出result值
来源:互联网 发布:淘宝美工做图尺寸 编辑:程序博客网 时间:2024/06/06 11:49
至此,要解决这个问题,只需反复套用这些递归关系即可。(注意:为了避免代码行不必要的回绕,以及确保代码的可读性,下面的代码使用了非常短的变量名。)
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值
- 9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
- 输入一个表达式,表达式中包括三种括号“()”、“[]”和“{}”,判断该表达式的括号是否匹配。
- 实现一个函数,计算一个字符串的值,该字符串中只有+ - * /四种运算符, 没有括号。 //参数mathString:要计算的字符串; //返回值:把计算出来的结果返回 例如:传入:@"1+2-1
- 算括号表达式的实现
- 实现一个简单的 eval 函数计算加减法和括号
- 写一个交换函数,在主程序中调用该函数,来实现实参值的交换。
- 用java实现输入学生的学号得出txt文件里该学号学生的信息
- C++实现算术表达式的括号匹配
- 已知一个字符串都是由左括号(和右括号)组成,判断该字符串是否是有效的括号组合。
- 定义一个函数,在该函数中可以实现任意两个整数的加法。java实现
- 输入一个只包含个位数字的简单四则表达式字符串,计算该表达式的值
- 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
- 链表栈实现表达式中括号的匹配检测
- 动态栈的实现,括号匹配问题,逆波兰表达式
- 请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
- 请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
- 请编写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
- Android Gradle配置自动生成JavaDoc
- 图片选择jsp和png
- android lowmemorykiller机制简介
- 关于苹果的IDFA(广告识别符)政策
- testlink+mantis
- 实现一个函数,算出有几种括号的放法可使该表达式得出result值
- 内存管理
- 运行命令集锦
- 手机分辨率dp和px转换
- CMU & Stanford 课程
- HDU1008 - Elevator (简单模拟)
- 51nod 1438:方阵与完全平方数
- VBS自动发送带格式和字体的邮件
- Ubuntu15.04 安装rtl8192cu无线网卡驱动