zoukankan      html  css  js  c++  java
  • hdu 5396 Expression

    太弱经常暴露智商.....

    最近刷的个个dp都是区间,记忆化搜索也区间

    然而窝组合数递推不会,规律推错了也不造,orz~~~

    这题就找个规律,直接记忆化搜索干就是了,没什么难得

    贴一发丑丑的代码,匿了

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll __int64
    const int mod=1e9+7;
    const int maxn=108;
    int a[maxn];
    char b[maxn];
    ll dp[maxn][maxn];
    ll pig[maxn][maxn],jie[maxn];
    void init()
    {
        int i,j;
        for(i=0;i<=100;i++)
        {
            pig[i][0]=pig[i][i]=1;
            for(j=1;j<i;j++)
                pig[i][j]=(pig[i-1][j]+pig[i-1][j-1])%mod;
        }
    }
    void initjie()
    {
        jie[0]=1;
        for(int i=1;i<=100;i++)
            jie[i]=jie[i-1]*i%mod;
    }
    void dfs(int l,int r)
    {
        int i;
        if(dp[l][r]!=-1)    return;
        if(l==r)    
        {
          dp[l][r]=a[l];
          return;
        }
        ll x,y,sum=0;
        for(i=l;i<r;i++)
        {
            dfs(i+1,r);
            dfs(l,i);
            if(b[i-1]=='*')
            {
                if(i-l>=1&&r-i-1>=1)
                { 
                    sum=(sum+pig[r-l-1][i-l]*(dp[l][i]*dp[i+1][r]%mod))%mod;
                }
                else
                    sum=(sum+dp[l][i]*dp[i+1][r])%mod;
            }
            if(b[i-1]=='-')
            {
                if(i-l>=1&&r-i-1>=1)
                { 
                    sum=(sum+pig[r-l-1][i-l]*
                    ((jie[r-i-1]*dp[l][i]-jie[i-l]*dp[i+1][r])%mod))%mod;
                }
                else
                    sum=(sum+jie[r-i-1]*dp[l][i]-jie[i-l]*dp[i+1][r])%mod;
            }
            if(b[i-1]=='+')
            {
                if(i-l>=1&&r-i-1>=1)
                { 
                    sum=(sum+pig[r-l-1][i-l]*
                    ((jie[r-i-1]*dp[l][i]+jie[i-l]*dp[i+1][r])%mod))%mod;
                }
                else
                sum=(sum+jie[r-i-1]*dp[l][i]+jie[i-l]*dp[i+1][r])%mod;
            }
        }
        dp[l][r]=sum;
    }
    int main()
    {
        int i,j,n;
        ll sum;
        init();
        initjie();
        while(scanf("%d",&n)==1)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            scanf("%s",b);
            memset(dp,-1,sizeof(dp));
            dfs(1,n);
            printf("%I64d
    ",(dp[1][n]+mod)%mod);
        }
        return 0;
    }
  • 相关阅读:
    4111130工作总结
    js enumerations 01
    有角度地事件解读,有品质地视觉呈现。《视界》
    Mule 入门之:环境搭建
    Date 对象用于处理日期和时间
    JS脚本,时间判断问题
    丈夫道(zhuan)
    查看IP连接netstat
    二代支付简介
    对付网页无法复制的最简单绝招 ( 转)
  • 原文地址:https://www.cnblogs.com/bitch1319453/p/4740729.html
Copyright © 2011-2022 走看看