括号匹配 (转载)
此文转自黑水浮云空间
/*
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 阅读(181) 评论(0) 收藏 举报
浙公网安备 33010602011771号