AcWing 1070. 括号配对 区间dp

AcWing 1070. 括号配对

Hecy 又接了个新任务:BE 处理。

BE 中有一类被称为 GBE。

以下是 GBE 的定义:

空表达式是 GBE
如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
如果 A 与 B 都是 GBE,那么 AB 是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。

注意:BE 是一个仅由(、)、[、]四种字符中的若干种构成的字符串。

输入格式
输入仅一行,为字符串 BE。

输出格式
输出仅一个整数,表示增加的最少字符数。

数据范围
对于所有输入字符串,其长度小于100。

输入样例:

[])

输出样例:

1

难度: 中等
时/空限制: 1s / 64MB
总通过数: 408
总尝试数: 795
来源: 《信息学奥赛一本通》
算法标签

这道题思路是区间dp,其实这道题并不难,刚开始的时候我的判断条件错了,所以这道题一直没有写出来,然后我的判断条件是
i f ( g [ i ] = = g [ j ] ) if(g[i]==g[j]) if(g[i]==g[j])
其实这是括号匹配,并不相等,我搞错了,我搞成了一个构成最长回文串的题目了,然后这道题改了条件之后,其实和构造回文串还是有一点点的区别,构造回文串我们可以在其两边增加,但是这道题我们增加的位置不确定了,所以我们要改一下做题的方式,如果相等就取 d p [ i ] [ j ] = d p [ i + 1 ] [ j − 1 ] dp[i][j]=dp[i+1][j-1] dp[i][j]=dp[i+1][j1],但是无论相等不相等,我们都要与 d p [ i ] [ k ] + d p [ k + 1 ] [ j ] ( i < = k < j ) dp[i][k]+dp[k+1][j](i<=k<j) dp[i][k]+dp[k+1][j](i<=k<j)中找到最小值。

最后,代码如下:

#include<iostream>
#include<string.h>

using namespace std;

const int N=110;
char g[N];
int dp[N][N];

bool match(int i,int j)
{
    if(g[i]=='('&&g[j]==')'||g[i]=='['&&g[j]==']')
    return true;
    return false;
}

int main(void)
{
    cin>>g;
    int len=strlen(g);
    for(int i=0;i<len;i++) dp[i][i]=1;
    for(int d=2;d<=len;d++)
     for(int i=0;i+d-1<len;i++)
     {
         int j=i+d-1;
         dp[i][j]=0x3f3f3f3f;
         if(match(i,j))
         dp[i][j]=dp[i+1][j-1];
     //    dp[i][j]=min(dp[i][j],min(dp[i+1][j],dp[i][j-1])+1);
         for(int k=i;k<j;k++)
         dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
     }
     cout<<dp[0][len-1];
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值