3 3 2 1 -+ 5 1 4 6 8 3 +*-*
2 999999689HintTwo numbers are considered different when they are in different positions.
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define LL long long
const int mod = 1000000000 + 7;
const int N = 105;
LL d[N][N];
char s[N];
int n;
LL C[N][N];
LL A[N];
void doit()
{
A[0] = 1;
for(int i = 1; i <= 100; i++)
A[i] = (A[i - 1] * i) % mod;
memset(C, 0, sizeof C);
for(int i = 0; i <= 100; i++)
{
C[i][0] = 1;
for(int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
}
}
int main()
{
doit();
while(~scanf("%d", &n))
{
for(int i = 1; i <= n; i++) scanf("%I64d", &d[i][i]);
scanf("%s", s + 1);
for(int L = 1; L <= n; L++)
for(int i = 1; i + L <= n; i++)
{
int j = i + L;
d[i][j] = 0;
for(int k = i; k < j; k++)
{
LL tmp;
if(s[k] == '*') tmp = (d[i][k] * d[k + 1][j]) % mod;
else if(s[k] == '+') tmp = (d[i][k] * A[j - k - 1] + d[k + 1][j] * A[k - i]) % mod;
else tmp = (d[i][k] * A[j - k - 1] - d[k + 1][j] * A[k - i]) % mod;
d[i][j] = (d[i][j] + tmp * C[j - i - 1][k - i]) % mod;
}
}
printf("%I64d\n", (d[1][n] + mod) % mod);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/dojintian/article/details/47841849