括号匹配(二)(动态规划)
括号匹配(二)
时间限制:1000 ms | 内存限制:65535 KB
难度:6
- 描述
- 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
- 输入
- 第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 - 输出
- 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
- 样例输入
-
4 [] ([])[] ((] ([)]
- 样例输出
-
0 0 3 2
题解:类似与区间dp; - 代码:
-
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string str; 5 int dp[111][111]; 6 int main(){ 7 int N; 8 cin>>N; 9 while(N--){ 10 str.clear(); 11 cin>>str; 12 for(int i=0;i<str.size();i++)dp[i][i]=1;//又是多了个等号,无语== 13 for(int i=1;i<str.size();i++){ 14 for(int j=i-1;j>=0;j--){ 15 dp[j][i]=dp[j][i-1]+1; 16 for(int k=j;k<i;k++){ 17 if(str[k]-str[i]==-1||str[k]-str[i]==-2) 18 dp[j][i]=min(dp[j][i],dp[j][k-1]+dp[k+1][i-1]); 19 //cout<<dp[j][i]<<" "; 20 } 21 } 22 } 23 cout<<dp[0][str.size()-1]<<endl; 24 } 25 return 0;}
刚开始用栈写的,没考虑清楚,果断错了;
代码:例如【))】
1 #include<stdio.h> 2 #include<stack> 3 #include<map> 4 using namespace std; 5 char s[110]; 6 int main(){ 7 int N,tot; 8 scanf("%d",&N); 9 while(N--){map<char,int>mp; 10 stack<char>sign; 11 tot=0; 12 mp['(']=1;mp[')']=-1; 13 mp['[']=2;mp[']']=-2; 14 scanf("%s",s); 15 for(int i=0;s[i];i++){ 16 if(mp[s[i]]>0)sign.push(s[i]); 17 else{ 18 if(!sign.empty()){ 19 if(mp[sign.top()]+mp[s[i]]==0)sign.pop(); 20 else tot++; 21 } 22 else tot++; 23 } 24 } 25 while(!sign.empty()){ 26 sign.pop(); 27 tot++; 28 } 29 printf("%d\n",tot); 30 } 31 return 0;}