• 1572:括号配对


    1572:括号配对

    时间限制: 1000 ms 内存限制: 524288 KB
    提交数: 889 通过数: 492
    【题目描述】
    Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。

    以下是 GBE 的定义:

    空表达式是 GBE
    如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
    如果 A 与 B 都是 GBE,那么 AB 是 GBE。

    【输入】
    输入仅一行,为字符串 BE。

    【输出】
    输出仅一个整数,表示增加的最少字符数

    【输入样例】
    [])
    【输出样例】
    1
    【提示】
    数据范围与提示:

    对于 100% 的数据,输入的字符串长度小于 100。

    思路:
    一开始思路错了,状态直接写的f[i][j]表示ij之间增加的最少字符数,不好表示,不好转移。
    但是发现题目的本质是求一个最长括号配对序列(感觉题目有稍微透露这个信息),所以直接设f[i][j]表示ij之间的最长匹配括号序列,代码如下;

    代码:

    /*
    其实这个题的实质就是求最长配对括号,剩下的不配对的直接加上相同数量的括号即可 
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    
    char a[10200];
    int f[1020][1020];
    
    int main()
    {
    	cin>>a+1;
    	int len=strlen(a+1);
    	
    //	memset(f,0x3f,sizeof(f));
    //	f[0][0]=0;
    //	f[0][1]=1;
    	
    	for(int i=2;i<=len;i++)//枚举长度 
    		for(int j=1;j+i-1<=len;j++)
    		{
    			int l=j;
    			int r=j+i-1;
    			if((a[l]=='['&&a[r]==']')||(a[l]=='('&&a[r]==')')) f[l][r]=max(f[l+1][r-1]+2,f[l][r]);
    			for(int k=l;k<r;k++)
    			{
    				f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]);
    			}
    		 } 
    		 
    	cout<<len-f[1][len]<<'
    ';
    	return 0; 
    }
    

    规律总结:
    发现做了三道区间dp题,每个区间dp的第一层循环不是循环分成了几部分,就是循环当前长度是多少(其实也相当于分成了几部分),之后做题会继续关注这一点,看一看是不是大部分区间dp的规律
    -----------------随时更新哦~~-------------------

  • 相关阅读:
    datadog数据json格式转换prometheus文本格式
    clickhouse聚合
    iOS面试
    程序员如何快速准备面试中的算法
    李刚OC语言疯狂讲义笔记
    传智播客内部 学习网站+书籍分享
    iOS-多线程总结笔记
    iOS-简化单例模式(定义成宏 以后通用)
    iOS-单例模式(懒汉式和饿汉式)和GCD实现
    iOS-队列组
  • 原文地址:https://www.cnblogs.com/yxr001002/p/14433136.html
Copyright © 2020-2023  润新知