题目描述

对于1 位二进制变量定义两种运算:

运算的优先级是:

  1. 先计算括号内的,再计算括号外的。

  2. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算。例如:计算表达式A⊕B × C时,先计算 B × C,其结果再与 A 做⊕运算。

现给定一个未完成的表达式,例如_+(_*_),请你在横线处填入数字0 或者1 ,请问有多少种填法可以使得表达式的值为0 。

输入输出格式

输入格式:

输入文件名为exp.in ,共 2 行。

第1 行为一个整数 L,表示给定的表达式中除去横线外的运算符和括号的个数。

第2 行为一个字符串包含 L 个字符,其中只包含’(’、’)’、’+’、’*’这4 种字符,其中’(’、’)’是左右括号,’+’、’*’分别表示前面定义的运算符“⊕”和“×”。这行字符按顺序给出了给定表达式中除去变量外的运算符和括号。

输出格式:

输出文件exp.out 共1 行。包含一个整数,即所有的方案数。注意:这个数可能会很大,请输出方案数对10007 取模后的结果。

输入输出样例

输入样例#1: 复制

  1. 4
  2. +(*)
输出样例#1: 复制

说明

【输入输出样例说明】

给定的表达式包括横线字符之后为:_+(_*_)

在横线位置填入(0 、0 、0) 、(0 、1 、0) 、(0 、0 、1) 时,表达式的值均为0 ,所以共有3种填法。

【数据范围】

对于20% 的数据有 0 ≤ L ≤ 10。

对于50% 的数据有 0 ≤ L ≤ 1,000。

对于70% 的数据有 0 ≤ L ≤ 10,000 。

对于100%的数据有 0 ≤ L ≤ 100,000。

对于50% 的数据输入表达式中不含括号。

开始写的区间dp....我真是菜

然后借鉴candy大神的blog

笛卡尔树建表达式树,然后树形dp

dp[i][1/0]表示根节点为i的区间值为1/0的方案数

文献http://wenku.baidu.com/link?url=jvyUVTTGFC27LnlHkzQ0OObqeBFDwCYvuCbiHHG5CaPXrjFiGoBtiLhdfNIhW1vHNNZ-Umb_zTKnCOQK3WTw0N8KRQT8m2lfBBMsHpoIChC

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. using namespace std;
  7. const int N=,MOD=;
  8. int n;
  9. char s[N];
  10. struct node{
  11. int l,r;
  12. char op;
  13. }tree[N];
  14. int cnt=,w[N],root=;
  15. void build(){
  16. int p=,cnt=;
  17. for(int i=;i<=n;i++){
  18. if(s[i]=='(') p++;if(s[i]==')') p--;
  19. if(s[i]=='+') {w[++cnt]=p*+;
  20. tree[cnt].op=s[i];
  21. }
  22. if(s[i]=='*') w[++cnt]=p*+,tree[cnt].op=s[i];;
  23. }
  24. int st[N],k,top=-;
  25. for(int i=;i<=cnt;i++) {
  26. k=top;
  27. while(k>=&&w[st[k]]>w[i]) k--;
  28. if(k!=-)tree[st[k]].r=i;
  29. if(k<top) tree[i].l=st[k+];
  30. st[++k]=i;
  31. top=k;
  32. }
  33. root=st[];
  34. }
  35. int f[N][];
  36. void dp(int i) {
  37. if(i==) return;
  38. if(f[i][]!=) return;
  39. int l=tree[i].l,r=tree[i].r;char op=tree[i].op;
  40. dp(l);dp(r);
  41. if(op=='+'){
  42. f[i][]=f[l][]*f[r][];
  43. f[i][]=f[l][]*f[r][]+f[l][]*f[r][]+f[l][]*f[r][];
  44. }
  45. if(op=='*'){
  46. f[i][]=f[l][]*f[r][];
  47. f[i][]=f[l][]*f[r][]+f[l][]*f[r][]+f[l][]*f[r][];
  48. }
  49. f[i][]%=MOD;f[i][]%=MOD;
  50. }
  51. int main() {
  52. scanf("%d",&n);
  53. scanf("%s",s+);
  54. build();
  55. f[][]=f[][]=;
  56. dp(root);
  57. printf("%d",f[root][]%MOD);
  58. return ;
  59. }

luogu P1310 表达式的值的更多相关文章

  1. 洛谷 P1310 表达式的值 解题报告

    P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. "× "运算优先于"⊕"运算,即计算表 ...

  2. 洛谷P1310 表达式的值

    P1310 表达式的值 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例 ...

  3. P1310 表达式的值

    P1310 表达式的值 题解 1.假设有两个布尔变量 x , y  x0表示使得x=0的方案数 x1表示使得x=1的方案数 y0表示使得y=0的方案数 y1表示使得y=1的方案数 | 按位或 & ...

  4. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  5. 【数据结构】P1310 表达式的值

    [题目链接] https://www.luogu.org/problem/P1310 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先 ...

  6. 【洛谷P1310 表达式的值】

    题目链接 题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式 ...

  7. 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用

    题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...

  8. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  9. P1981 表达式求值

    P1981 表达式求值 题解 这个题联想一下  P1310 表达式的值  思路就是输入中缀式,转成后缀式,然后按后缀式计算,完美!!       but!! 会严重RE,因为你可能会输入中缀式的时候输 ...

随机推荐

  1. Python基础学习总结__Day4

    一.装饰器 前戏: 1.函数即变量 (1)函数名为‘门牌号’即内存地址,加括号开始调用 (2)没有变量调用将清空内存 (3)匿名函数(lambda函数):没有‘门牌号’,需要赋值给变量,否则将会被清空 ...

  2. python基本数据类型和简单用法

    一.int 整形范围 How Big Is an int? In Python2, the size of an int was limited to 32 bits, which is enough ...

  3. PAT Basic 1079

    1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0.N 被称 ...

  4. 打印机增强软件pdfpro

     http://3dx.pc6.com/gm1/pdfpro.zip    

  5. ubuntu12.04安装teamviewer

    ubuntu 12.04 64位 下载地址:http://downloadap2.teamviewer.com/download/teamviewer_linux_x64.deb 下载之后,选中,右击 ...

  6. Linux学习-灾难复原的考虑

    硬件损毁,且具有完整备份的数据时 由于是硬件损毁,所以我们不需要考虑系统软件的不稳定问题,所以可以直接将完整的系统复原回去 即可. 由于软件的问题产生的被攻破资安事件 由于系统的损毁是因为被攻击,此时 ...

  7. INDEX && PRIMARY KEY && UNIQUE KEY

    When I have do some sql tody, some confusion come up to me. Its about the index && PRIMARY K ...

  8. python - 读取配置文件

    # -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: read_config.py @ide: PyCharm Commun ...

  9. [PDOException] SQLSTATE[HY000] [2002] No such file or directory

    编译安装PHP7之后,在安装mysql之后,用pdo操作数据库的时候,出现了此错误[PDOException] SQLSTATE[HY000] [2002] No such file or direc ...

  10. andorid studio 环境搭建

    1 安装jdk,配置jdk的环境变量http://www.cnblogs.com/liuhongfeng/p/4177568.html(通过java ,javac, java -version来察看j ...