zoukankan      html  css  js  c++  java
  • 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的规律
    -----------------随时更新哦~~-------------------

  • 相关阅读:
    6174问题
    阶乘的精确值
    小学生算术
    Primer回顾 数组和指针
    Primer回顾 标准库类型
    绪论
    字符串的存储
    条款39:明智而审慎的使用private继承
    条款34:区分接口继承和实现继承
    条款33:避免遮掩继承而来的名称
  • 原文地址:https://www.cnblogs.com/yxr001002/p/14433136.html
Copyright © 2011-2022 走看看