混合表达式

混合表达式

题目描述:
大概是一个前缀后缀中缀都有的混合表达式,让你求能够成几种答案。

啊不知道哪里脑子抽了深搜不会写(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();
}

“`

猜你喜欢

转载自blog.csdn.net/beautiful_CXW/article/details/81346766