括号匹配 (转载)

此文转自黑水浮云空间

/*
DP解法:

F[i][j]表示到第i个位置的字符位置,有j-1个未被匹配的‘(’的状态有多少种,那么

    f[i][j]=f[i-1][j-1]  s[i]=‘(’;

    f[i][j]=f[i-][j+1]  s[i]=‘)’;

f[i][j]=f[i-1][j-1]+f[i-1][j+1]  s[i]=‘?';

最后输出f[len-1][1]即可,之所以j不直接从0开始(即最后输出f[len-1][0]),是为了
避免转移方程中出现j=0,使得减1后小于0。
*/


#include <iostream>   

using namespace std;   

int f[20][20],i,j,l;   

char s[20];   

int main()   

{   

    while(gets(s))   

    {   

        memset(f,0,sizeof(f));   

        l=strlen(s);   

        if(s[0]!=')')

        {

            f[0][2]=1;   

            for(i=1;i<l;i++) 

                for(j=1;j<l;j++)  

                    if(s[i]=='?')

                       f[i][j]=f[i-1][j-1]+f[i-1][j+1];

                    else

                       f[i][j]=f[i-1][j+(s[i]-40)*2-1];   

                       

        }

        printf("%d\n",f[l-1][1]);   

    }   

}  

posted on 2011-05-11 10:56  more think, more gains  阅读(174)  评论(0编辑  收藏  举报

导航