考虑到此题麻烦了某hust大神&体现出了自己数学能力的欠缺 虽然最近一直比较忙 还是把这题的题解写下来吧

首先看完数据范围后 应该有不少人会反应到是$n^3$的DP 以$F[i][j]$表示从i到j这个区间所有情况之和

然后再枚举中间点$k$从$F[i][k]$到$F[k+1][j]$转移过来 但此题绝不是想到DP就可以了

--------------------------------------------------------------------------------------------------------------------------------

我们假设合并时 左区间所包含的情况为$a1.a2……ap$右区间所包含的情况为 $b1.b2……bq$

对于乘法运算 由于乘法分配率这个性质 直接把两边所有情况之和乘起来就行了

对于加减法运算 左边的区间每个元素出现的次数为q 右边区间每个元素出现的次数为p

进一步 我们可以发现 出现次数p、q其实也就等于(区间长度-1)! (感叹号代表阶乘 不要看错= =)

看起来该做的事情已经做完了 然而如果就这样写完代码 会发现连样例都过不了

---------------------------------------------------------------------------------------------------------------------------------

多想想之后 我们发现这样一个问题 虽然合并时 左右区间都是确定的 然而达到同一个左右区间的方案并不是唯一的

我们先考虑一个比较小的情况 假设左区间通过$c1.c2$这两个操作得到  右区间通过$d1.d2$这两个操作得到

那么我们只要保证同一区间内操作的有序性即可使得最后得到的两个区间分别相同

比如$c1.c2.d1.d2$或$c1.d1.c2.d2$或……

这样可能的情况就有$C_{4}^{2}$种 推广到其他情况便是

C((左区间长度-1)+(右区间长度-1),(左区间长度-1)) (注意到区间长度-1即为合并过程中的操作数)

于是这题便愉快地解决了

#include <bits/stdc++.h>
using namespace std;
const int N=,MOD=1e9+;
long long f[N][N],fac[N],c[N][N];
char s[N];
int n;
void prepare()
{
fac[]=;
for(int i=;i<=;++i)
fac[i]=fac[i-]*i%MOD;
c[][]=;
for(int i=;i<=;++i)
{
c[i][]=;
for(int j=;j<=i;++j)
c[i][j]=(c[i-][j-]+c[i-][j])%MOD;
}
}
void work()
{
for(int i=;i<=n;++i)
{
scanf("%lld",&f[i][i]);
for(int j=i+;j<=n;++j)
f[i][j]=;
}
scanf("%s",&s[]);
for(int len=;len<=n;++len)
for(int i=;i+len-<=n;++i)
{
int j=i+len-;
for(int k=i;k<j;++k)
{
if(s[k]=='*')
f[i][j]+=f[i][k]*f[k+][j]%MOD*c[j-i-][k-i];
else if(s[k]=='+')
f[i][j]+=(f[i][k]*fac[j-k-]+f[k+][j]*fac[k-i])%MOD*c[j-i-][k-i];
else
f[i][j]+=(f[i][k]*fac[j-k-]-f[k+][j]*fac[k-i])%MOD*c[j-i-][k-i];
f[i][j]%=MOD;
}
}
//for(int i=1;i<=n;++i)
// for(int j=i;j<=n;++j)
// printf("%d %d %lld\n",i,j,f[i][j]);
printf("%lld\n",(f[][n]+MOD)%MOD); }
int main()
{
prepare();
while(~scanf("%d",&n))
work();
return ;
}

hdu 5396 Expression的更多相关文章

  1. 2015 Multi-University Training Contest 9 hdu 5396 Expression

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

  2. HDU 5396 Expression(DP+组合数)(详解)

    题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种  (1+1)*2   或者   ...

  3. hdu 5396 Expression(区间dp)

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

  4. HDU 5396 区间DP 数学 Expression

    题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...

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

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

  6. hdu5396 Expression

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

  7. 组合数学第一发 hdu 2451 Simple Addition Expression

    hdu 2451 Simple Addition Expression Problem Description A luxury yacht with 100 passengers on board ...

  8. HDU 2451 Simple Addition Expression(组合数学)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2451 Problem Description A luxury yacht with 100 pass ...

  9. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

随机推荐

  1. array_map() 函数

    定义和用法 array_map() 函数返回用户自定义函数作用后的数组.回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致. 语法 array_map(function,a ...

  2. dp(最长公共子序列)

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...

  3. Linux grep常用命令

    在一个文件中同时查找多个字符串: 并集语法: grep -e 'pattern1 -e 'pattern2 file 或集语法: 1.grep -E 'pattern1|pattern2' file ...

  4. vector中数据释放崩溃问题

    struct LINE { char securityID[32]; /*!< 证券代码 */ int64_t dateTime; /*!< 日期时间(日期变化)YYYYMMDDhhmms ...

  5. vue + element 创建教程

    一.环境准备 node安装 node版本:v10.15.3 node下载地址:https://nodejs.org/zh-cn/ vue-cli安装 全局安装vue-cli npm install - ...

  6. [三下五除二]在Eclipse上的JFinal_Demo

    承接上回在IDEA的JFinal的项目的导入,今次同样是同一个文件,但在Eclipse上运行.在Eclipse上运行官网的JFinal的例子是及其快捷. 打开Eclipse,并进入如下的界面. 点击导 ...

  7. macos系统安装mysql

    MacOS系统安装mysql 一.下载 官网下载链接地址:https://dev.mysql.com/downloads/mysql/ 二.安装 打开文件是pkg包,双击进行安装: 按照提示: 点击最 ...

  8. 一、Google开发者工具功能页面截图

    一.利用Chrome开发者工具功能进行网页整页截图的方法. 打开你想截图的网页,然后按下 F12(macOS 是 option + command + i)调出开发者工具, 接着按「Ctrl + Sh ...

  9. Django 高级配置

    目录 Django 信号 信号系统三要素: 信号的分类: Django 内置信号: 具体 Django 信号内容 定义信号 发送信号 接收信号 信号接收器 防止重复信号 Django 内置信号操作步骤 ...

  10. mysql授予权限

    grant show databases on *.* to 'asg'@'%'; grant select on *.* to 'asg'@'%'; grant show view on *.* t ...