【区间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)\)