括号匹配

 

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;
}

 

posted @ 2013-05-14 16:18  galaxy77  阅读(151)  评论(0编辑  收藏  举报