【NOIP】普及组2011 表达式的值
【算法】动态规划+后缀表达式
【题解】
先把算式转为后缀表达式后进行DP
令f[s][0]表示使表达式答案为0的方案数
f[s][1]表示使表达式答案为1的方案数
(加法)
f[a+b][1]=f[a][0]*f[b][1]+f[a][1]*f[b][0]+f[a][1]*f[b][1]
f[a+b][0]=f[a][0]*f[b][0]
(乘法)
f[a+b][0]=f[a][0]*f[b][0]+f[a][0]*f[b][1]+f[a][1]*f[b][0]
f[a+b][1]=f[a][1]*f[b][1]
【后缀表达式】
1.对符号设置优先级,即先计算的符号,一般是 () > * > + 。
2.从前往后扫描,遇到数字入数字栈顶,遇到符号入符号栈顶。
如果当前符号优先级低于栈顶符号,那么弹出栈顶符号并对数字栈顶和次顶弹出做该符号运算,结果重新作为数字栈顶。
重复直至优先级高于栈顶符号或栈空。
3.遇到左括号直接入栈,遇到右括号弹出符号栈顶直至左括号停止。
为了最后能清空符号栈,通常最开始加入左括号,最后加入右括号。
4.本题的DP其实是对数字栈DP,每次运算时对应变换DP数组f[]。
我的代码中的写法是先处理出后缀表达式(数字直接放,符号压栈),然后再用后缀表达式模拟数字栈变化。
【注意】
1.记得取模10007。
2.调试几小时的教训!在计算“+”的f[a+b][1]的时候调用了f[a+b][0],所以一定要把f[a+b][1]先计算!!!(“*”反之)T_T调得好累……
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
const int maxn=,mod=;
char s[maxn*],t[maxn*],now[maxn*],c;
int lenn,lent,len,num,n;
int f[maxn][];
void jrz()
{
while(now[lenn]=='+'||now[lenn]=='*')t[++lent]=now[lenn--];
now[++lenn]='+';
}
void crz()
{
while(now[lenn]=='*')t[++lent]=now[lenn--];
now[++lenn]='*';
}
void kcz()
{
while(now[lenn]!='(')t[++lent]=now[lenn--];
lenn--;
}
void pluss()
{
f[num][]=(f[num][]*f[num+][]+f[num][]*f[num+][]+f[num][]*f[num+][])%mod;
f[num][]=(f[num][]*f[num+][])%mod;
}
void cheng()
{
f[num][]=(f[num][]*f[num+][]+f[num][]*f[num+][]+f[num][]*f[num+][])%mod;
f[num][]=(f[num][]*f[num+][])%mod;
}
void change()
{
now[]='(';lenn=;lent=-;
for(int i=;i<=len;i++)
{//printf("%d",i);
//for(int j=0;j<=lenn;j++)printf("%c",now[j]);
//printf(" lenn=%d\n",lenn);
if(s[i]=='_')t[++lent]='_';
if(s[i]=='+')jrz();
if(s[i]=='*')crz();
if(s[i]=='(')now[++lenn]='(';
if(s[i]==')')kcz();
}
kcz();//printf("lenn=%d",lenn);printf("[t]\n\n%s\n\n",t);
}
void work()
{
num=;
for(int i=;i<=lent;i++)
{
if(t[i]=='_')
{
num++;
f[num][]=;f[num][]=;
}
if(t[i]=='+')num--,pluss();//printf("f[%d][0]=%d,f[%d][1]=%d\n",num,f[num][0],num,f[num][1]);
if(t[i]=='*')num--,cheng();//printf("f[%d][0]=%d,f[%d][1]=%d\n",num,f[num][0],num,f[num][1]);
}
}
int main()
{
// freopen("exp.in","r",stdin);
// freopen("exp.out","w",stdout);
scanf("%d",&n);
c=getchar();c=getchar();
len=-;
if(c!='(')s[]='_',len=;
s[++len]=c;
for(int i=;i<=n;i++)
{
c=getchar();
if(c!='('&&s[len]!=')')s[++len]='_';
s[++len]=c;
}
if(c!=')')s[++len]='_';
// printf("\n\n%s\n\n",s);
change();
work();
printf("%d",f[][]);
return ;
}
【NOIP】普及组2011 表达式的值的更多相关文章
- NOIP 普及组 2013 表达式求值
传送门 https://www.cnblogs.com/violet-acmer/p/9898636.html 题解: 哇哇哇,又是一发暴力AC. 用字符数组存储表达式. 然后将表达式中的 数字 与 ...
- [NOIP普及组2011]装箱问题
目录 链接 博客链接 题目链接 题目内容 题目描述 格式 输入 输出 样例 输入 输出 前缀知识 题解 题目名称:装箱问题 来源:2011年NOIP普及组 链接 博客链接 CSDN 洛谷博客 题目链接 ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- [NOIp普及组2011]瑞士轮
洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...
- 数字反转 NOIp普及组2011
当数字位数不确定时,如何反转呢? 本文为博客园ShyButHandsome原创作品,转载请注明出处 使用右侧目录快速浏览文章 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数. 新数也应满 ...
- 2016.8.15上午纪中初中部NOIP普及组比赛
2016.8.15上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1333 这次比赛不怎么好,因为这套题目我并不是很擅长. 可同学们 ...
- 2016.8.17上午纪中初中部NOIP普及组比赛
2016.8.17上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1335 本来觉得自己能考高分,但只得160分,并列第九.至少又挤 ...
- 2016.9.24初中部上午NOIP普及组比赛总结
2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...
- 2321. 【NOIP普及组T1】方程
2321. [NOIP普及组T1]方程 时间限制: 1000 ms 空间限制: 262144 KB 题目描述
随机推荐
- 3dContactPointAnnotationTool开发日志(二)
今天看的时候发现其实www的方式是可以根据指定路径读取本地图片到Image中的.也就是昨天提到的第二种方式. 随便选了个图片做示范: 修改后的代码如下: using System.Collec ...
- 【week2】Scrum中的站立会议
Scrum站立会议 站立会议给我的第一印象就是站着开会,在经过我查阅资料之后,发现也是差不多的意思.学术一点的分析就是在Sprint开始后,团队将会在每个工作日特定时间举行一个简短会议,每次会议 ...
- Node js路由
/* 要为程序提供请求的 URL 和其他需要的 GET 及 POST 参数,随后程序需要根据这些数据来执行相应的代码. 因此,需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST ...
- ES6之 =>箭头函数
原文,请点此链接http://www.cnblogs.com/allenxieyusheng/p/5784728.html 1. 第一个函数 ()=>1 解析:其实这是一个匿名函数直接执行 (f ...
- BZOJ 1202 狡猾的商人(带权并查集)
给出了l,r,w.我们就得知了s[r]-s[l-1]=w.也就是说,点l-1和点r的距离为w. 于是可以使用带权并查集,定义dis[i]表示点i到根节点的距离.查询和合并的时候维护一下就OK了. 如果 ...
- [BZOJ2055] 80人环游世世界
Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团伙,也想来一次环游世界. 他们 ...
- [CF785E]Anton and Permutation
题目大意:有一串数为$1\sim n(n\leqslant2\times10^5)$,$m(m\leqslant5\times10^4)$次询问,每次问交换位置为$l,r$的两个数后数列中逆序对的个数 ...
- [SDOI2017]新生舞会 0/1分数规划
---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...
- BZOJ2820:YY的GCD——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2820 Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...
- [bzoj] 3669 NOI2014 魔法森林 || LCT
原题 copy一篇题解:原链接 将边按照a排序,然后从小到大枚举,加入图中. 在图中用lct维护一棵两点之间b最大值尽量小的生成树. 当加入一条边(u, v)时: 如果(u, v)不连通,则直接加入这 ...