每次合并两个数,做过石子合并的人都能看出来是区间 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. kettle 使用 CARTE 执行

    在执行KETTLE 任务的时候,可以使用本地执行,或者使用carte server执行. 1.启动carte server .\Carte.bat localhost 8080 2.配置子服务器 这里 ...

  2. 下列哪个选项是对ICMP FLOOD攻击的正确描述?

    A.  通过重复发送HTTP GET请求,将内容传输的负载施加到攻击目标服务器上. B.  通过使用ping命令发送大量请求包,导致通向被攻击服务器过载并阻止访问. C.  通过发送与连接启动请求对应 ...

  3. uni-app下载文件在ios下失败

    标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...

  4. Flutter问题 Flutter MissingPluginException(No implementation found for method xxx on channel xxx)

    问题如题 有时候项目跑着跑着突然控制台就报了这个错,用hot restart也没有用,问题的本质是plugin没有找到,这时候有两种方法 flutter clean,会将依赖清除,这时候再重新pub ...

  5. Archlinux常用软件推荐 更新于2022年5月

    必装软件# xdg-user-dirs-gtk 执行 xdg-user-dirs-gtk-update 可将更新Home目录路径 包管理工具# yay 代替pacman的包管理 downgrade p ...

  6. How to Use cURL HTTP/2 on macOS

    cURL is one of most powerful tools for testing HTTP traffic. We typically use cURL to interact with ...

  7. 对CGAL5.0及以后版本编译的说明

    CGAL5.0及以后版本只有头文件,没有库文件了.这意味着CGAL无需编译,只需安装好CGAL的依赖项即可.类似Eigen库.

  8. 在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not find com.android.tools.

    在用Android StudioBuild项目时,提示:Could not resolve all files for configuration ':classpath'.Could not fin ...

  9. [转]Java Swing组件编程之JTable表格用法实例详解

    原文链接: Java Swing组件编程之JTable表格用法实例详解

  10. 《CUDA编程:基础与实践》读书笔记(3):同步、协作组、原子函数

    1. 单指令多线程模式 从硬件上看,一个GPU被分为若干个SM.线程块在执行时将被分配到还没完全占满的SM中,一个线程块不会被分配到不同的SM中,一个SM可以有一个或多个线程块.不同线程块之间可以并发 ...