括号匹配

 

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

 

转载于:https://www.cnblogs.com/assult/archive/2013/05/14/3078000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值