题目:1070. 括号配对
思路:大佬思路,具有区间性,然后又是可以按边界来更新状态,所以可以考虑区间dp,
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<double,double>PII;
const int N=1e5+10;
const int mod=1000000009;
char a[110];
int f[110][110];//f[i][j]中,i表示的是区间左端点,j表示的是区间右端点
bool check(int x,int y){
if(a[x]=='['&&a[y]==']'||a[x]=='('&&a[y]==')') return true;
return false;
}
int main(){
scanf("%s",a+1);
int lena=strlen(a+1);
for(int i=1;i<=lena;i++){//因为是具有连续性,所以用区间dp,这里的i是区间的长度,从1到lena;
for(int j=1;j+i-1<=lena;j++){//左区间
int r=j+i-1;//右区间
if(j==r) f[j][r]=1;//当区间长度为1时,最少要增加一个字符
else{
f[j][r]=20000;//默认初始化为INF正无穷
if(check(j,r)){//边界合法的时候
f[j][r]=min(f[j][r],f[j+1][r-1]);//当长度为2的时候,这里j+1>r-1,但f[j+1][r-1]为0,所以没有影响
}
for(int k=j;k<r;k++){//将j-r区间分成两段来更新f[j][r]
f[j][r]=min(f[j][r],f[j][k]+f[k+1][r]);
}
}
}
}
cout<<f[1][lena];
return 0;
}