每次合并两个数,做过石子合并的人都能看出来是区间 dp。

设状态 \(dp_{i,j}\) 表示区间 \([i,j]\) 中合并为一个数的所有情况之和。

那么我们就可以枚举断点 \(k\):

  1. \(b_k\) 为 \(+\):\([i,k]\) 中的每种情况都要和 \([k+1,j]\) 中的每种情况产生一个贡献,所以总贡献为 \(dp_{i,k}\times(j-k-1)!+dp_{k+1,j}\times(k-i)!\)。
  2. \(b_k\) 为 \(-\):同 1 理,贡献为 \(dp_{i,k}\times(j-k-1)!-dp_{k+1,j}\times(k-i)!\)。
  3. \(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 题解的更多相关文章

  1. hdu5396 Expression

    Expression Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. ACM学习历程—HDU5396 Expression(递推 && 计数)

    Problem Description Teacher Mai has n numbers a1,a2,⋯,an and n−1 operators("+", "-&qu ...

  3. hdu5396 Expression 区间dp +排列组合

    #include<stdio.h> #include<string> #include<map> #include<vector> #include&l ...

  4. [hdu5396 Expression]区间DP

    题意:给一个表达式,求所有的计算顺序产生的结果总和 思路:比较明显的区间dp,令dp[l][r]为闭区间[l,r]的所有可能的结果和,考虑最后一个符号的位置k,k必须在l,r之间,则l≤k<r, ...

  5. codeforcess水题100道

    之所以在codeforces上找这100道水题的原因是为了巩固我对最近学的编程语言的掌握程度. 找的方式在codeforces上的PROBLEMSET中过的题最多的那些题里面出现的最前面的10个题型, ...

  6. 《LeetBook》leetcode题解(10): Regular Expression Matching——DP解决正则匹配

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  7. LeetCode题解——Regular Expression Matching

    题目: 正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次. 解法: 一定要注意'*'必须结合前面的字符一起使用. 代码: class S ...

  8. [LeetCode]题解(python):010-Regular Expression Matching

    题目来源: https://leetcode.com/problems/regular-expression-matching/ 题意分析: 这道题目定义了两个正则表达式规则.’.’代表任意字符,’* ...

  9. PAT甲题题解-1130. Infix Expression (25)-中序遍历

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  10. HDU 6342 Expression in Memories(模拟)多校题解

    题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...

随机推荐

  1. qiankun 的 JS 沙箱隔离机制

    为什么需要JS沙箱 想象一下 当一个应用(比如应用 A)加载时,可能会对 window 对象的属性进行修改或添加.如果不加控制,这些修改会影响到之后加载的其他应用(比如应用 B),就会导致属性读写冲突 ...

  2. HASHCTF2024

    第一届山东大学HASHCTF部分Misc题解 下面是我在本次比赛出的题目的WriteUp Secret of Keyboard 签到脚本题,有些同学的脚本解出来大小写不正确可能是由于脚本无法识别shi ...

  3. Vue项目“TypeError: Cannot read property ‘_wrapper’ of undefined

    前情 最近在开发一个H5营销活动项目,为了更高的开发效率我使用了Vue全家桶来实现. 坑位 在开发中遇到一个奇怪报错(报错截图如下),从提示看也定位不到是哪里出问题 Why? 在报错的页面仔细看了一遍 ...

  4. Three.js案例-360全景房看

    在 360° 看房功能中,我们需要在浏览器中创建一个类似虚拟现实的场景,使得用户能够查看环境的每一个角落.这一功能的实现本质上是利用 球体映射技术,即通过将全景图作为纹理贴图映射到一个反向的球体上,用 ...

  5. d2js 中实现 memcached 共享 session 的过程

    https://github.com/inshua/d2js/blob/master/WebContent/guide/memcached-session.md 基于 https://github.c ...

  6. betterZip解压后压缩包会删除 zip文件解压后原压缩文件能不能删掉

    https://www.betterzipcn.com/faq/better-ydeq.html 品牌型号:MacBook Book Air 系统:MacOS Mojave 10.14 软件版本:Be ...

  7. python安装pip出现No package python-pip available

    安装pip: 使用yum进行安装 yum install python-pip 1 若出现 No package python-pip available. 则解决方法如下:   yum -y ins ...

  8. IntelliJ IDEA生成jar包运行报Error:A JNI error has occurred,please check your installation and try again

    首先介绍一下IntelliJ IDEA生成jar包的方式: 1.打开项目,打开FIile->Project Structure...菜单.如下图: 选中Artifacts,点+号,选择JAR,再 ...

  9. [转]C# PowerPoint操作的基本用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using OFFICECO ...

  10. Redis学习笔记之Jedis

    Jedis语法总结 Jedis是Java代码操作Redis的工具包,里面封装了操作Redis的方法 Jedis jedis = new Jedis(String ip , String port) 1 ...