两种做法,一种dp,一种dfs,因为这个数据比较小,所以dfs全排列的方式是可以接受的,但是当比较大的时候就不行了,所以dp的方式还是要掌握一下的,我这里是dfs的做法,网上有很多人写的dp,可以去看一下,尤其是当遍历到右括号的时候的处理方式需要好好想一想
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[20]; int len,ans,mark[20]; bool ok() { int lena = strlen(a),tot = 0; for(int i = 0;i < lena;i++) { if(a[i] == '(') tot++; if(a[i] == ')') tot--; if(a[i] == '?') return false; if(tot < 0) return false; } if(tot != 0) return false; return true; } void dfs(int now) { if(now == len) { if(ok()) ans++; return; } a[mark[now]] = '('; dfs(now+1); a[mark[now]] = ')'; dfs(now+1); } int main() { while(~scanf("%s",a)) { int lena = strlen(a); len = 0; for(int i = 0;i < lena;i++) { if(a[i] == '?') { mark[len++] = i; } } ans = 0; dfs(0); printf("%d ",ans); } return 0; }