[HDU5396] Expression 题解
每次合并两个数,做过石子合并的人都能看出来是区间 dp。
设状态 \(dp_{i,j}\) 表示区间 \([i,j]\) 中合并为一个数的所有情况之和。
那么我们就可以枚举断点 \(k\):
- \(b_k\) 为 \(+\):\([i,k]\) 中的每种情况都要和 \([k+1,j]\) 中的每种情况产生一个贡献,所以总贡献为 \(dp_{i,k}\times(j-k-1)!+dp_{k+1,j}\times(k-i)!\)。
- \(b_k\) 为 \(-\):同 1 理,贡献为 \(dp_{i,k}\times(j-k-1)!-dp_{k+1,j}\times(k-i)!\)。
- \(b_k\) 为 \(*\):同 1 理,贡献为 \(dp_{i,k}\times dp_{k+1,j}\)。
由于可以穿插,每个贡献还要乘上 \(C_{j-i-1}^{k-i}\)。
时间复杂度 \(O(n^2t)\)。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll p=1e9+7;
int n,a[105];
char b[105];
ll jc[105],inv[105];
ll dp[105][105];
ll qpow(ll x,int y){
ll re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p;
y>>=1;
}return re;
}ll C(int x,int y){
return jc[x]*inv[y]%p*inv[x-y]%p;
}void zjy_zkal(){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>dp[i][i];
cin>>(b+1);
for(int l=2;l<=n;l++)
for(int i=1,j=l;j<=n;i++,j++)
for(int k=i;k<j;k++){
ll add=0;
if(b[k]=='*')
add=dp[i][k]*dp[k+1][j]%p;
if(b[k]=='+')
add=(dp[i][k]*jc[j-k-1]+dp[k+1][j]*jc[k-i])%p;
if(b[k]=='-')
add=(dp[i][k]*jc[j-k-1]-dp[k+1][j]*jc[k-i])%p;
dp[i][j]=(dp[i][j]+add*C(j-i-1,k-i))%p;
}
cout<<(dp[1][n]+p)%p<<"\n";
}int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
jc[0]=1;
for(ll i=1;i<=100;i++)
jc[i]=jc[i-1]*i%p;
inv[100]=qpow(jc[100],p-2);
for(ll i=100;i;i--)
inv[i-1]=inv[i]*i%p;
while(cin>>n) zjy_zkal();
return 0;
}
[HDU5396] Expression 题解的更多相关文章
- hdu5396 Expression
Expression Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- ACM学习历程—HDU5396 Expression(递推 && 计数)
Problem Description Teacher Mai has n numbers a1,a2,⋯,an and n−1 operators("+", "-&qu ...
- hdu5396 Expression 区间dp +排列组合
#include<stdio.h> #include<string> #include<map> #include<vector> #include&l ...
- [hdu5396 Expression]区间DP
题意:给一个表达式,求所有的计算顺序产生的结果总和 思路:比较明显的区间dp,令dp[l][r]为闭区间[l,r]的所有可能的结果和,考虑最后一个符号的位置k,k必须在l,r之间,则l≤k<r, ...
- codeforcess水题100道
之所以在codeforces上找这100道水题的原因是为了巩固我对最近学的编程语言的掌握程度. 找的方式在codeforces上的PROBLEMSET中过的题最多的那些题里面出现的最前面的10个题型, ...
- 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- LeetCode题解——Regular Expression Matching
题目: 正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次. 解法: 一定要注意'*'必须结合前面的字符一起使用. 代码: class S ...
- [LeetCode]题解(python):010-Regular Expression Matching
题目来源: https://leetcode.com/problems/regular-expression-matching/ 题意分析: 这道题目定义了两个正则表达式规则.’.’代表任意字符,’* ...
- PAT甲题题解-1130. Infix Expression (25)-中序遍历
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- HDU 6342 Expression in Memories(模拟)多校题解
题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...
随机推荐
- BurpSuite-暴力破解以及验证码识别绕过
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无 ...
- 《前端运维》一、Linux基础--08Shell其他及补充
这一篇,我们来学习一些重要的命令,在工作中也会经常用到. 一.简单正则 要注意的是,有些命令不支持正则模式,比如fs.find等,有些是支持正则的,比如grep.awk.sed等.正则的语法和js中的 ...
- AD使用插件生成交互式BOM
AD使用插件生成交互式BOM 效果图镇楼: 下面来说一下怎么搞,过程其实也很简单,就加载一个脚本的事儿. 1.下载AD用交互式BOM插件 首先前往GitHub下载这位大佬开发的插件 地址:https: ...
- FastExcel 合并单元格(相当的行数据,进行合并)
目录 需求 思路 实现 Excel导出单元格全量合并策略 日期格式转换 接口代码 Service DTO 使用FastExcel数据导出:官网: https://idev.cn/fastexcel/z ...
- C++顺序结构(3)、数据类型_____教学
一.设置域宽setw() 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽. 使用setw()前,必须包含头文件iomanip,即#include<iomanip> 头文件ioman ...
- 部署docker-registry+ui shell 域名证书-用户认证
#部署docker-registry+ui shell docker registry 配置域名证书, 用户密码认证, 轻量UI ansible部署docker-registry+ui https:/ ...
- Win11 恢复 Win10 风格菜单
这个效果最好:https://github.com/valinet/ExplorerPatcher 不要入 Start11 之类的坑,也不需要改注册表,改注册表也改不出来.
- 强化学习算法中的log_det_jacobian
相关: https://colab.research.google.com/github/google/brax/blob/main/notebooks/training_torch.ipynb 之前 ...
- manim边学边做--同伦变换
在Manim中,移动一个元素除了之前介绍的方法之外,还可以通过同伦运算来移动一个元素. 与普通的移动元素方式相比,使用同伦运算移动一个元素时,实际上是在考虑整个空间的连续变形过程中元素的相应变化. 这 ...
- Qt/C++地图测距/显示不同线段的距离/拿到测距结果/测距结束信号
一.前言说明 地图测距在地图组件中属于一个比较小众的功能,但是又不得不提供,有时候用户希望直接在地图上选点,测算距离,尤其是在一些军事领域用的比较多,测距功能提炼出来的共性就是,每一段都有距离,最后鼠 ...