hdu 5396 Expression
考虑到此题麻烦了某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的更多相关文章
- 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 ...
- HDU 5396 Expression(DP+组合数)(详解)
题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种 (1+1)*2 或者 ...
- hdu 5396 Expression(区间dp)
Problem Description Teacher Mai has n numbers a1,a2,⋯,anand n−1 operators("+", "-&quo ...
- HDU 5396 区间DP 数学 Expression
题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...
- HDU 6342 Expression in Memories(模拟)多校题解
题意:给你一个规则,问你写的对不对. 思路:规则大概概括为:不能出现前导零,符号两边必须是合法数字.我们先把所有问号改好,再去判断现在是否合法,这样判断比一边改一边判断容易想. 下面的讲解问号只改为+ ...
- hdu5396 Expression
Expression Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 组合数学第一发 hdu 2451 Simple Addition Expression
hdu 2451 Simple Addition Expression Problem Description A luxury yacht with 100 passengers on board ...
- HDU 2451 Simple Addition Expression(组合数学)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2451 Problem Description A luxury yacht with 100 pass ...
- HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)
6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...
随机推荐
- python操作mysql之增删改查
[insert] import MySQLdb conn = MySQLdb.connect(","08day5" ) cur = conn.cursor() #把数据放 ...
- CNN之池化层tf.nn.max_pool | tf.nn.avg_pool | tf.reduce_mean | padding的规则解释
摘要:池化层的主要目的是降维,通过滤波器映射区域内取最大值.平均值等操作. 均值池化:tf.nn.avg_pool(input,ksize,strides,padding) 最大池化:tf.nn.ma ...
- .net Datatable
1. ROW remove vs delete datatable dt = new datatable() //fill 5 records for each row as datarow in d ...
- HTML5基本标签<搬运>
HTML语言基本标签: 创建一个HTML文档<html></html> 设置文档标题以及其他不在WEB网页上显示的信息<head></head> 设置文 ...
- 链接层-UDP
五大特点:无连接,不可靠,面向报文传输,没有拥塞控制,首部开销小
- kmp(循环节)
Cyclic Nacklace Problem Description CC always becomes very depressed at the end of this month, he ha ...
- Codeforces - 1195D2 - Submarine in the Rybinsk Sea (hard edition) - 组合数学
https://codeforc.es/problemset/problem/1195/D2 很明显可以看出,任意一个长度为\(l_1\)的数串\(s_1\)和任意一个长度为\(l_2\)的数串\(s ...
- linux上执行jmeter脚本
1.linux上安装jmeter 将windows上的zip包直接放到linux上 进入bin目录,chmod 777 jmeter 修改环境变量: 1 2 3 4 # vim /etc/profil ...
- mongodb的有关操作
mongodb的几种启动方法 https://www.cnblogs.com/LLBFWH/articles/11013791.html MongoDB 之 你得知道MongoDB是个什么鬼 Mong ...
- IDEA中web项目maven项目手动打war包的方式
手动打包 https://blog.csdn.net/ibigboy/article/details/90287963 tomcat部署web项目方法 https://www.cnblogs.com/ ...