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