【区间dp】B001_AW_括号匹配(匹配和不匹配)

输入格式
输入仅一行,为字符串 BE。
输出格式
输出仅一个整数,表示增加的最少字符数。
数据范围
对于所有输入字符串,其长度小于100。

输入样例:
[])
输出样例:
1

方法一:dp

f[l][r] 表示使得s[l:r]成为匹配字符串的最下添加个数

  • 思考状态转移方程
    • f[l][r]=min(f[l][r], f[l+1][r-1],if (s[l]==s[r])
    • f[l][r]=min(f[l][r], f[l][i]+f[i+1][r]),whatever
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f, N=105;
int f[N][N];
char s[N];

bool chk(int l, int r) {
    return (s[l]=='[' && s[r]==']') || (s[l]=='(' && s[r]==')';
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    scanf("%s", s+1); int n = strlen(s+1);
    for (int len=1; len<=n; len++)
    for (int l=1; l+len-1<=n; l++) {
        int r=l+len-1;
        if (len==1) f[l][r]=1;
        else {
            f[l][r]=inf;
            if (chk(l,r)) f[l][r]=min(f[l][r], f[l+1][r-1]);
            for (int i=l; i<=r; i++) {
                f[l][r]=min(f[l][r], f[l][i]+f[i+1][r]);
            }
        }
    }
    cout << f[1][n];
    return 0;
}

复杂度分析

  • Time\(O(n^3)\)
  • Space\(O(n^2)\)
原文地址:https://www.cnblogs.com/wdt1/p/13637066.html