括号匹配 (转载)
此文转自黑水浮云空间
/* 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) 编辑 收藏 举报