混合表达式
题目描述:
大概是一个前缀后缀中缀都有的混合表达式,让你求能够成几种答案。
啊不知道哪里脑子抽了深搜不会写(50分),然后大概想了个DP,区间DP,对于合法的[l,r](即能够成解的)但是……一开始没想到DP的是值还是个数,我怕值会产生多个,然后每一次更新就要产生更多的值但其实……一共才360(总值域) ,根本不会爆。
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int mi,ma;
struct node
{
vector<int> p;
node(){p.clear();}
node operator +(node x)
{
node y;
int a[805];
for (int i=0;i<=800;i++) a[i]=0;
for (int i=0;i<p.size();i++) a[p[i]+400]=1;
for (int i=0;i<x.p.size();i++) a[x.p[i]+400]=1;
for (int i=0;i<=800;i++) if (a[i]==1) y.p.push_back(i-400);
return y;
}
node operator -(node x)
{
node y;
int a[805];
for (int i=0;i<=800;i++) a[i]=0;
for (int i=0;i<p.size();i++)
{
for (int j=0;j<x.p.size();j++)
{
a[p[i]-x.p[j]+400]=1;
}
}
for (int i=0;i<=800;i++) if (a[i]==1) y.p.push_back(i-400);
return y;
}
node operator *(node x)
{
node y;
int a[805];
for (int i=0;i<=800;i++) a[i]=0;
for (int i=0;i<p.size();i++)
{
for (int j=0;j<x.p.size();j++)
{
a[p[i]+x.p[j]+400]=1;
}
}
for (int i=0;i<=800;i++) if (a[i]==1) y.p.push_back(i-400);
return y;
}
};
node f[105][105];
string s;
int n,s1[105],s2[105];
bool judge(int l,int r)
{
if (s2[r]-s2[l-1]==s1[r]-s1[l-1]+1) return true;
return false;
}
node dfs(int l,int r)
{
if (f[l][r].p.size()!=0) return f[l][r];
node a,b,x;
if (l==r)
{
x.p.push_back(s[l]-'0');
return x;
}
if (s[l]=='+'||s[l]=='-')
{
for (int i=l+1;i<r;i++)
{
if (judge(l+1,i)&&judge(i+1,r))
{
a=dfs(l+1,i);
b=dfs(i+1,r);
if (s[l]=='+') x=x+(a*b);
else x=x+(a-b);
}
}
}
if (s[r]=='+'||s[r]=='-')
{
for (int i=l;i<r-1;i++)
{
if (judge(l,i)&&judge(i+1,r-1))
{
a=dfs(l,i);
b=dfs(i+1,r-1);
if (s[r]=='+') x=x+(a*b);
else x=x+(a-b);
}
}
}
for (int i=l+1;i<r;i++)
{
if (s[i]=='+'||s[i]=='-')
{
if (judge(l,i-1)&&judge(i+1,r))
{
a=dfs(l,i-1);
b=dfs(i+1,r);
if (s[i]=='+') x=x+(a*b);
else x=x+(a-b);
}
}
}
f[l][r]=x;
return x;
}
int main()
{
// freopen("expression.in","r",stdin);
// freopen("expression.out","w",stdout);
cin>>s;
n=s.size();
s=" "+s;
for (int i=1;i<=n;i++)
{
s1[i]=s1[i-1];
s2[i]=s2[i-1];
if (s[i]=='+'||s[i]=='-') s1[i]++;
else s2[i]++;
}
node x=dfs(1,n);
cout<<x.p.size();
}
“`