[ An Ac a Day ^_^ ] FZU 2030 括号问题 搜索

本文介绍了使用递归深度优先搜索解决括号匹配问题的方法,包括两种不同的算法实现:一种通过遍历所有可能的括号组合来计算合法的括号序列数;另一种则通过数学方法快速得出答案。

 FZU一直交不上去 先写在这吧

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<math.h>
 5 #include<string.h>
 6 #include<string>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<queue>
11 #define M(a,b) memset(a,b,sizeof(a))
12 using namespace std;
13 typedef long long ll;
14 char s[20];
15 int l,ans;
16 void dfs(int len,int mat){
17     if(len==l&&mat==0){
18         ans++;
19         return ;
20     }
21     if(len==l&&mat!=0) return ;
22     if(s[len]=='(') dfs(len+1,mat+1);
23     if(s[len]==')') dfs(len+1,mat-1);
24     if(s[len]=='?'){
25         dfs(len+1,mat+1);
26         dfs(len+1,mat-1);
27     }
28 }
29 
30 int main(){
31     while(gets(s)){
32         l=strlen(s);
33         ans=0;
34         dfs(0,0);
35         printf("%d\n",ans);
36     }
37     return 0;
38 }
39 /*
40 
41 ((??))
42 
43 */

 

 

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<math.h>
 5 #include<string.h>
 6 #include<string>
 7 #include<map>
 8 #include<set>
 9 #include<vector>
10 #include<queue>
11 #define M(a,b) memset(a,b,sizeof(a))
12 using namespace std;
13 typedef long long ll;
14 char s[20];
15 int l,ans,cnt,num;
16 int main(){
17     while(gets(s)){
18         l=strlen(s);
19         ans=0;
20         cnt=0;
21         num=0;
22         for(int i=0;i<l;i++){
23             if(s[i]=='(') cnt++;
24             if(s[i]==')') cnt--;
25             if(s[i]=='?') num++;
26         }
27         num-=cnt;
28         printf("%.0lf\n",pow(2,num/2));
29     }
30     return 0;
31 }
32 /*
33 
34 ((??))
35 
36 */

 

转载于:https://www.cnblogs.com/general10/p/5801043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值