题目意思:

给定一个表达式,运算符没有优先级,求不同顺序计算,所有可能的得到的结果之和。

由于运算符没有优先级,所以有多种顺序去计算,设d[i][j]表示[i,j]区间表达式通过不同顺序计算,所以可能得到的结果之和,

枚举最后一次运算符是第t个,有可能是加减乘三种,所以需要不同处理。

最后由于s[i][t],s[t+1][j],内部运算的绝对顺序确定,但是s[i][j]整体的相对顺序还没确定,所以乘上C[t-i][j-i-1].

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define maxn 150
#define LL long long
#define MOD 1000000007
using namespace std;
LL s[maxn][maxn];
LL C[maxn][maxn];
LL fac[maxn];
int n;
int a[maxn];
char op[maxn];
void init()
{
fac[]=;
for(int i=;i<maxn;i++)
{
fac[i]=(fac[i-]*i)%MOD;
}
C[][]=;
for(int j=;j<maxn;j++)
{
C[][j]=;
for(int i=;i<maxn;i++)
{
C[i][j]=( (C[i][j-]+C[i-][j-])) %MOD; //²»Ñ¡£¬C[i][j-1],Ñ¡£¬C[i-1][j-1]
}
}
// printf("%lld\n",C[3][6]);
}
void init1()
{
memset(s,,sizeof(s));
}
void solve()
{
for(int tt=;tt<=n;tt++)
for(int i=;i<=n;i++)
{
int j=i+tt;
if(j>n)
continue;
for(int t=i;t<=j-;t++)
{
if(op[t]=='+')
{
int k1=fac[t-i];
int k2=fac[j-(t+)];
LL temp=;
temp = ( (k2*s[i][t])%MOD+(k1*s[t+][j])%MOD )%MOD;
temp = (temp *C[t-i][j-i-]) %MOD;
s[i][j]= (s[i][j]+temp)%MOD;
}
else if(op[t]=='-')
{
int k1=fac[t-i];
int k2=fac[j-(t+)];
LL temp=;
temp = ( (k2*s[i][t])%MOD-(k1*s[t+][j])%MOD +MOD)%MOD;
temp = (temp *C[t-i][j-i-]) %MOD;
s[i][j]= (s[i][j]+temp)%MOD;
}
else if(op[t]=='*')
{
LL temp=;
temp =(s[i][t]*s[t+][j]) % MOD;
temp = (temp *C[t-i][j-i-]) %MOD;
s[i][j]= (s[i][j]+temp)%MOD;
}
}
}
/* for(int tt=1;tt<=n;tt++)
{
for(int i=1;i<=n;i++)
{
int j=i+tt;
if(j>n)
continue;
printf("%lld ",(s[i][j]+MOD)%MOD );
}
printf("\n");
}*/
printf("%lld\n",s[][n]);
}
int main()
{
// freopen("test.txt","r",stdin);
init();
while(~scanf("%d",&n))
{
init1();
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
s[i][i]=a[i];
//printf("%d ",a[i]);
}
scanf("%s",&(op[]));
// printf("%s\n",&(op[1]));
solve();
}
return ;
}

hdu5396(区间DP)的更多相关文章

  1. [hdu5396 Expression]区间DP

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

  2. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  3. 【POJ-1390】Blocks 区间DP

    Blocks Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5252   Accepted: 2165 Descriptio ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. BZOJ1055: [HAOI2008]玩具取名[区间DP]

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1588  Solved: 925[Submit][Statu ...

  6. poj2955 Brackets (区间dp)

    题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...

  7. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  8. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  9. 区间dp总结篇

    前言:这两天没有写什么题目,把前两周做的有些意思的背包题和最长递增.公共子序列写了个总结.反过去写总结,总能让自己有一番收获......就区间dp来说,一开始我完全不明白它是怎么应用的,甚至于看解题报 ...

随机推荐

  1. [POJ2443]Set Operation(bitset)

    传送门 题意:给出n个集合(n<=1000),每个集合中最多有10000个数,每个数的范围为1~10000,给出q次询问(q<=200000),每次给出两个数u,v判断是否有一个集合中同时 ...

  2. 【webstorm 系列之一】快捷键很好用啊

    书签 bookmarks , 在多文件中调试很方便 断点只能在js文件中用,而bookmark可以在所有文件中使用 书签开关 F11  (给光标所在行加书签) 显示书签 Shift + F11 书签号 ...

  3. Last Defence - UVA7045

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. vue学习001 --环境搭建

    系统 : win cmd: cmder 链接:https://cmder.net/ 1.安装node.js 链接地址: http://cdn.npm.taobao.org/dist/node/v10. ...

  5. git服务端安装

    Windows平台下Git服务器搭建 第一步:下载Java,下载地址:http://www.java.com/zh_CN/  注意要下载是完整的JDK(其中有jre) 第二步:安装Java.安装步骤不 ...

  6. Spring MVC异常处理实例

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-example.ht ...

  7. @Aspect注解无效

    Pointcut的execution配置正确的话,检查下,是否加了以下jar包 <!-- http://mvnrepository.com/artifact/org.aspectj/aspect ...

  8. Android Activity与远程Service的通信学习总结

    当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意 ...

  9. java notify notifyAll

    notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法. void notify(): 唤醒一个正在等待该对象的线程.void notifyAll(): 唤醒所 ...

  10. HTML5开发实战——Sencha Touch篇(1)

    学习了很多主要的Sencha Touch内容,已经了解了Sencha Touch的开发模式.接下来一段时间我们将利用Sencha Touch来进行自己的web应用构建. 先要解决的是前端的问题.从最简 ...