1 条题解

  • 1
    @ 2024-04-06 13:52:29

    因为是匹配括号,所以见到两个相同的直接忽略,继续处理内层即可。具体解析见代码。

    #include<bits/stdc++.h>
    using namespace std;
    int n,dp[105][105];//dp[i][j]:从i到j要加的括号数 
    string s;
    int main(){
        cin>>s;
        n=s.size();
        s=' '+s;//加空格防止错误
        for(int i=1;i<=n;i++)//只有字符的区间要加一个括号 
            dp[i][i]=1;
        for(int len=2;len<=n;len++){//长度
            for(int st=1,ed=st+len-1;ed<=n;st++,ed++){//起点和终点
                dp[st][ed]=0x3f3f3f3f;//初始化为极大值
                for(int mid=st;mid<=ed;mid++){//中点
                    dp[st][ed]=std::min(dp[st][ed],dp[st][mid]+dp[mid+1][ed]);//正常情况则正常由断点分开计算
                    if(s[st]=='('&&s[ed]==')'||s[st]=='['&&s[ed]==']')//有一对括号
                        dp[st][ed]=std::min(dp[st][ed],dp[st+1][ed-1]);//直接继承,不必再考虑此括号
                }
            }
        }
        printf("%d",dp[1][n]);
        return 0;
    }
    
  • 1

「一本通 5.1 练习 1」括号配对

信息

难度
9
分类
(无)
标签
(无)
递交数
8
已通过
3
通过率
38%
上传者