事情是这样的,本人一眼就瞅见了:
对于50%的数据输入表达式中不含括号。
这句话,于是突发奇想,想骗50分,结果只有10pts 望大佬求调(代码有点抽象,我会加点注释)
#include<bits/stdc++.h>
#define itn int
#define tin int
#define nit int
#define tni int
#define nti int
#define scnaf scanf
#define ptrinf printf
#define icn cin
#define cni cin
#define inc cin
#define nci cin
#define nic cin
#define cuot cout
#define ocut cout
#define fro for
using namespace std;
int L,s,f[1001][1001][2];
string a;
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin>>L;
cin>>a;
for(int i=0;i<L;i++)
{
if(a[i]!='(' && a[i]!=')')s++;
}
for(int i=0;i<L;i++)
{
for(int j=0;j<i;j++)
{
if(a[j]=='+' && a[i]=='*')swap(a[j],a[i]);
}
}
s+=1;
//阶段s,f[i][j][k]为前i个数放前j个符号结果为k
for(int i=0;i<=1000;i++)
for(int j=0;j<=1000;j++)
for(int k=0;k<=1;k++)
f[i][j][k]=1;
for(int i=1;i<=s;i++)
{
for(int j=1;j<i;j++)
{
for(int k=0;k<=1;k++)
{
if(a[j-1]=='*') if(k==0)
f[i][j][k]=(f[i-1][j-1][k]*2+f[i-1][j-1][k+1])%10007;//乘法为0时从前一个的0可以跟0或1(*2)加上前一个为1时只能跟0(+1)
else f[i][j][k]=f[i-1][j-1][k];
else if(k==0)
f[i][j][k]=f[i-1][j-1][k];
else f[i][j][k]=(f[i-1][j-1][k-1]+f[i-1][j-1][k]*2)%10007;//加法为1时从前一个的1可以跟0或1(*2)加上前一个为0时只能跟1(+1)
}
}
}
cout<<f[s][s-1][0]%10007;
return 0;
}