zoukankan      html  css  js  c++  java
  • 括号匹配

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1165

    要是 字符串 只有几十个就可以用搜索  不过这里 最多有1000个 只能用dp啦。。。

    d[i][j]  前i个字符中含有j个')' 的方法数

    动态转移方程为d[i][j]=(d[i-1][j]+d[i-1][j-1]) (当s[i]=='('时 和s[i]==')'时 的两种情况      输出 d[len][(len)/2]

    有个要注意的地方是 d[i][0]不能全部初始化为1   像  ()??  a[2][0] 就不可能为1     要是前i个包括i 的')'数不为0   a[i][0]就要 初始化为0 

    --------------------------------------

    *做递推时 一般i从1开始 输入的时候scanf("%s",s+1)   因为  许多时候 i为0时要初始化 而且 第i层的结果要由 i-1出来  更多的 自己还要 再慢慢体会啦。。。

    -------------------------------------

    #include<stdio.h>
    #include<string.h>
    int d[1002][1002];
    int main()
    {
        int i,j,n,m,len,c;
        char s[1002];
        while(~scanf("%s",s+1))
        {
            getchar();
            c=0;
            len=strlen(s+1);
            for(i=1;i<=len;i++)
                if(s[i]==')')
                    c++;
                if(len%2==1||s[1]==')'||s[len]=='('||c>len/2)
                {
                    printf("0\n");
                    continue;
                }
                memset(d,0,sizeof(d));
                c=0;
                for(i=1;i<=len;i++)
                {
                    if(s[i]==')')
                        c++;
                    if(c)
                        d[i][0]=0;
                    else d[i][0]=1;
                }
                for(i=1;i<=len;i++)
                {
                    if(s[i]=='(')
                        for( j=1;j<=i/2;j++)
                        {
                            d[i][j]=d[i-1][j];
                        }
                        else if(s[i]==')')
                        {
                            for(j=1;j<=i/2;j++)
                                d[i][j]=d[i-1][j-1];
                        }
                        else
                        {
                            for(j=1;j<=i/2;j++)
                                d[i][j]=(d[i-1][j]+d[i-1][j-1])%1000000007;
                        }
                }
                
                printf("%d\n",d[len][(len)/2]);
        }
        return 0;
    }
  • 相关阅读:
    每日一题_191208
    每日一题_191207
    每日一题_191206
    每日一题_191205
    每日一题_191204
    每日一题_191203
    每日一题_191202
    每日一题_191201
    每日一题_191130
    2020届成都一诊理科16题
  • 原文地址:https://www.cnblogs.com/assult/p/3078000.html
Copyright © 2011-2022 走看看