括号配对【区间DP】【回文子串】

23 篇文章 0 订阅
1 篇文章 0 订阅

括号配对

题意

递归定义一组字符匹配模式

增加几个字符满足这个匹配。

image-20201007210347985

思路

添加多少个字符,可以转化为n-“回文子串”,这里的回文子串需要重新定义

AAAABBBB:A符合定义,B也符合定义的话:最长子串,我们枚举中间端点取最大值。

ABBA:这种情况,我们判断【l, r】 match(l,r)是不是匹配,匹配的话f(l+1,r-1)+2

代码

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define mst(s,_s) memset(s, _s, sizeof(s))
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int N = 1e3+100;
int T,n,m;

char str[N];
int f[N][N];

bool match(char a,char b)
{
    if(a=='(' && b==')') return true;
    if(a=='[' && b==']') return true;
    else return false;
}

int main() {
    cin>>str+1;
    n=strlen(str+1);
    
    for(int len=2;len<=n;len++)
    {
        for(int l=1;l+len-1<=n;l++)
        {
            int r=l+len-1;
            if(len==1) f[l][r]=0;
            if(match(str[l],str[r])) f[l][r]=max(f[l][r],f[l+1][r-1] + 2);
            for(int k=l;k<r;k++)
            {
               f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);
            }
        }
    }
    cout<<n - f[1][n]<<endl;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++初级主要包括基本语法、数据类型、控制流程、函数、数组、指针等内容。下面是一个简单的介绍: 1. 基本语法:C++是一种面向对象的编程语言,使用分号作为语句结束符,使用花括号表示代码块。 2. 数据类型:C++提供了多种数据类型,包括整型、浮点型、字符型、布尔型等。可以使用关键字来声明变量,并进行初始化。 3. 控制流程:C++提供了条件语句(if-else语句、switch语句)和循环语句(for循环、while循环、do-while循环)来控制程序的执行流程。 4. 函数:C++中可以定义函数来封装一段可重用的代码。函数可以有参数和返回值,可以在函数内部进行各种操作。 5. 数组:C++中可以使用数组来存储一组相同类型的数据。数组可以通过索引访问元素,并可以进行遍历和操作。 6. 指针:C++中的指针是一种特殊的变量,它存储了内存地址。可以使用指针来访问和修改内存中的数据。 关于求字符串中连续回文子串的最大长度,可以使用动态规划算法来解决。具体步骤如下: 1. 定义一个二维数组dp,其中dp[i][j]表示字符串从索引i到j的子串是否回文子串。 2. 初始化dp数组,将所有长度为1的子串都标记为回文子串。 3. 遍历字符串,从长度为2的子串开始,依次判断每个子串是否回文子串。如果是回文子串,则更新dp数组。 4. 在遍历过程中记录最长的回文子串长度。 5. 返回最长的回文子串长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值