Loj 10150 括号匹配

#这道题搜不到题解.md
#只搜到一个只有方程的题解.avi
#就自己写个题解.asdjhadskj
这道题是这样的
f [ i ] [ j ] f[i][j] 表示 i i j j 区间内所补全所需的最小值
那么我们设置一个断点 k ( k [ i , j ] ) k(k∈[i,j])
f [ i ] [ j ] = m i n ( f [ i ] [ k ] + f [ k + 1 ] [ j ] ) f[i][j]=min(f[i][k]+f[k+1][j])
意思是,将 i i k k k + 1 k+1 j j 拼起来得到的最小的补全个数
还有,如果有字串 S S ,在 S S 的外面加一对括号,那么 S S 的补全数不变
i f ( P i P e i ( s [ i ] , s [ j ] ) = = t r u e ) f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i + 1 ] [ j 1 ] ) if(PiPei(s[i],s[j])==true) f[i][j]=min(f[i][j],f[i+1][j-1])
source:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define inf 0x7fffffff/2
int f[105][105];
char a[106];
bool check(char a, char b){
    if(a == '(' && b == ')') return 1;
    if(a == '[' && b == ']') return 1;
    return 0;
}
int main(int argc, char const *argv[]){
    freopen("gbe.in","r",stdin);
    scanf("%s",a+1);
    int n=strlen(a+1);
    for(int i=1;i<=n;i++)
        f[i][i]=1;
    for(int L=2;L<=n;L++)
    {
        for(int i=1;i<=n-L+1;i++)
        {
            int j=i+L-1;
            f[i][j]=0x3f3f3f3f;
            for(int k=i;k<=j;k++)
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
            if(check(a[i],a[j])) f[i][j]=min(f[i][j],f[i+1][j-1]);
        }
    }
    printf("%d",f[1][n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jiangbojun2017/article/details/82595889