• 括号匹配(二)(动态规划)


     

    括号匹配(二)

    时间限制: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
    ",tot);
    30     }
    31 return 0;}
  • 相关阅读:
    PHP Document 注释标记及规范 && PHP命名规范
    JavaScript 最佳实践
    PHP正则表达式详解(三)
    $_SERVER["SCRIPT_NAME"]、$_SERVER["PHP_SELF"]、$_SERVER["QUERY_STRING"]、$_SERVER["REQUEST_URI"]
    PHP判断远程文件是否存在
    HDOJ1251-统计难题(trie树入门)
    Spark的日志配置
    实现Android 动态载入APK(Fragment or Activity实现)
    OC与JS互相调用
    mac os使用lsusb命令和连接未知的Android设备
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4719004.html
Copyright © 2020-2023  润新知