初学DP(1) 黑书中的《括号序列》

括号序列 题目描述 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列; 2.如果S是规则序列,那么(S),[S],{S}和也是规则序列; 3.如果A和B都是规则序列,那么AB也是规则序列。 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{}>> 而以下几个则不是: (,[,],)(,()),([(),<<,{(}),<{}>) 现在,给你 阅读详情
题目:括号序列
定义如下规则序列(字符串):
1.空序列是规则序列;
2.如果S是规则序列,那么(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列;
例如,下面的字符串都是规则序列:
(),    [],    (()),    ([]),    ()[()];
而这几个就不是规则序列:
(,    [,    )(,    ([];
现在给出一些有'(',')','[',']'构成的序列,请添加少量的括号,得到一个规则的序列。

分析:
用s[i],s[j]表示字符串S的第i个字符和第j个字符,i<j,用ans[i][j]表示从第i个字符到第j个字符最少需要添加的括号数;
如果s[i]='(',s[j]=')'或 s[i]='[',s[j]=']',那么ans[i][j]=min(ans[i+1][j-1],ans[i][j]);
如果s[i]='(',s[j]!=')'或s[i]='[',s[j]!=']',那么ans[i][j]=min(ans[i+1][j]+1,ans[i][j]);
如果s[i]!='(',s[j]=')'或s[i]!='[',s[j]=']',那么ans[i][j]=min(ans[i][j-1]+1,ans[i][j]);  

根据这个我们有如下递推关系:

int  bracket(int  i,int  j){
        if (i>j)    return 0;
        else if (i==j)    return 1;
        int answer = inf;
        if ((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))        answer =  min(answer,bracket(i+1,j-1));
        else if (s[i]=='(' || s[i]=='[')    answer = min(answer,bracket(i+1,j)+1);
        else if (s[j]==')' || s[j]==']')    answer = min(answer,bracket(i,j-1)+1);
        for (int k=i;k<j;k++)    answer = min(answer,bracket(i,k)+bracket(k+1,j));
        return answer;
}

我们发现上面的递归重复计算了好多,下面对于  bracket[0,3]进行说明
我们发现 bracket[0,1]以及bracket[2,3]有重复操作, 因此如果我们递归求 bracket[0,len-1]中len超过100的话, 重复操作非常大,很浪费时间;为此我们可以采取先计算出最低 层的 bracket,对于更高的bracket可以直接使 用较低的 bracket,这就是自底向下的递推;
参考代码:
#include <iostream>
#include <string.h>
using namespace std;
#define MAX 0xffffff
int main(){
 int dp[105][105];
 char s[105];
 while (cin>>s){
     int n=strlen(s);
     for (int i=0;i<n;i++){
         dp[i][i-1]=0;
         dp[i][i]=1; 
     }
     for (int k=1;k<n;k++){	//表示i跟j之间的距离
          for (int i=0;i<n-k;i++){
              int j=i+k;
              dp[i][j]=MAX;
              if ((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){
                  dp[i][j]=dp[i+1][j-1];
              }
              for (int p=i;p<j;p++){
                  if (dp[i][j]>dp[i][p]+dp[p+1][j]){
                      dp[i][j]=dp[i][p]+dp[p+1][j];
                  }
             }
         }
      }
      cout<<dp[0][n-1]<<endl;
 }
 return 0;
}


题目意思和上面一样,只是题目要你求出这个规则序列,为此我们只需要记录需要插入的位置,当我们需要输出时,采用递推的方式,对于从s[i]到s[j]的序列,如果pos[i][j]=-1则说明s[i]和s[j]括号匹配,我们可以先输出s[i],再继续考虑s[i+1]到s[j-1]的序列,最后输出s[j],如果pos[i][j]不等于-1则说明s[i]和s[j]不匹配,我们就需要对s[i]进行匹配,输出匹配后,我们再继续考虑s[i+1]到s[j]的序列;
#include <iostream>
#include <string.h>
using namespace std;
#define inf 0xffffff
int dp[105][105];
int pos[105][105];
char s[105];
void show(int i,int j){
	if (i>j)	
		return;
	if (i==j){
		if(s[i]=='('||s[i]==')') 
			cout<<"()";
  		else	
  			cout<<"[]";
  	}
  	else{
  		if (pos[i][j]==-1){
  			cout<<s[i];
  			show(i+1,j-1);
  			cout<<s[j];
  		}
  		else{
  			show(i,pos[i][j]);
  			show(pos[i][j]+1,j);
  		}
  	}
}

int main(){		
	cin>>s;
	int n=strlen(s);
	for (int i=0;i<n;i++){
		dp[i][i-1]=0;
		dp[i][i]=1;
	}
	for (int k=1;k<n;k++){	//表示i跟j之间的距离
		for (int i=0;i<n-k;i++){
			int j=i+k;
			dp[i][j]=inf;
			if ((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')){
				pos[i][j]=-1;
				dp[i][j]=dp[i+1][j-1];
			}
			for (int p=i;p<j;p++){
				if (dp[i][j]>dp[i][p]+dp[p+1][j]){
					pos[i][j]=p;
					dp[i][j]=dp[i][p]+dp[p+1][j];
				}
			}
		}
	}
	show(0,n-1);
	cout<<endl;
	return 0;
}

注意:在poj上提交时如果用while(cin>>s)这个循环输入的话会使提交结果为WA,我也不知道为什么。。。



UVA 1626括号序列DP 题意: 题目背景: 我们将正规括号序列定义如下: 空序列是正规括号序列。 如果S是一个正规括号序列,那么(S)和[S]都是正规括号序列。 如果A和B都是正规括号序列,那么AB是一个正规括号序列。 例如,下面这些序列都是正规括号序列: (),[],(()),([]),()[],()[()] 而下面这些不是正规括号序列: (,[,),)(,([)],([] 题目描述: 给你一些含有字符’(’,’)’,’[‘和’]'的括号序列。你需要找一个最短的正规括号序列,使给定括号序列作为一个子序列包含在其中。 输入描述: 阅读详情

相关推荐

【基础练习】【区间DP】codevs3657 括号序列题解

题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例如以下是合法的括号序列: (), [], (()), ([]), ()[], ()[()] 以下是不合法括号序列的: (, [, ], )(, ([]), ([

西家家 2079

题解 - 洛谷P1241【括号序列】

原题链接【洛谷】 题目描述 定义如下规则序列(字符串): 空序列是规则序列; 如果 SSS 是规则序列,那么 (S)(S)(S) 和 [S][S][S] 也是规则序列; 如果 AAA 和 BBB 都是规则序列,那么 ABABAB 也是规则序列。 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()] 而以下几个则不是: (,[,],)(,()),([() 现在...

硅谷小蛙的技术博客 1239

STM32F103C8T6核心板——复用引脚实战配置指南

本文详细介绍了STM32F103C8T6核心板中复用特殊功能引脚(如SWD、JTAG和BOOT引脚)的实战配置方法。通过具体的代码示例和硬件连接建议,帮助开发者解决GPIO资源不足的问题,同时避免常见的配置陷阱,提升项目开发的灵活性和效率。

weixin_30325971的博客 591

dp 括号序列

原题:括号序列【基础算法・动态规划】——高级 题意: 给一个字符串,用最小的字符把它补成规则序列。 定义如下规则序列(字符串): 空序列是规则序列; 如果S是规则序列,那(S)和[S]也是规则序列; 如果A和B都是规则序列,那么AB也是规则序列。 解析: 首先是判断串里面,在删减一部分后所能形成的最长规则序列,例如()[]((,最长的规则序列为()[]为4。 这个就是最经典的括号...

QAQ 855

括号序列bracket(c)

括号序列 【问题描述】 定义如下规则序列(字符串): 1.空序列是规则序列; 2.如果S是规则序列,那么(S)和[s]也是规则序列; 3.如果A和B都是规则序列,那么AB也是规则序列。 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()] 而以下几个则不是: (,[,],)(,()),([() 现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列。(对于序列a1,a2,…,an和序列b1,b2,…,bn,如果存在一组下标1≤i1<i2<…<in≤m,使得aj=bj对一切1≤j≤n.成立,那么a1,a2,…,an就叫做b1,b2,bm的子列。 【输入】 输入文件仅一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,长度不超过100 【输出】 输出文件也仅有一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,把你找到的规则序列输出即可。因为规则序列不止一个,因此要求输出的的规则序列尽可能短。 【样例】 bracket.in ([() bracket.out ()[]()

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

STL练习之堆栈 括号序列

问题 G: 括号序列 时间限制:1.000Sec内存限制:128 MB提交状态 题目描述 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列; 2.如果S是规则序列,那么(S),[S],{S}和<S>也是规则序列; 3.如果A和B都是规则序列,那么AB也是规则序列。 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{}>&gt...

weixin_63958709的博客 846

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1288

codevs 2058 括号序列

题目描述 Description 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列; 2.如果S是规则序列,那么(S),[S],{S}和也是规则序列; 3.如果A和B都是规则序列,那么AB也是规则序列。   例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}{{}}),>   而以下几个则不是: (,

有一种力量叫乐观 867

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。

2303_79243743的博客 1046

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

黑书DP例题

黑书DP例题

Icefox的博客 602

【GLM5】手把手教你在openclaw中白嫖英伟达羊毛

openclaw很强,但是也很贵,每一次请求都会消耗大量的token。而英伟达平台正好可以白嫖免费的模型,于是,我们一拍即合。

Science prince的博客 3820

栈—括号序列

以此题作为栈的练习: 题目链接 题目: 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列; 2.如果S是规则序列,那么(S),[S],{S}和也是规则序列 3.如果A和B都是规则序列,那么AB也是规则序列 例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{...

星星leslie的博客 374

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1408

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1901

2058 括号序列

题目描述 Description 定义满足以下规则字符串为规则序列,否则不是规则序列: 1.空序列是规则序列; 2.如果S是规则序列,那么(S),[S],{S}和也是规则序列; 3.如果A和B都是规则序列,那么AB也是规则序列。   例如,下面的字符串都是规则序列: (),[],(()),([]),()[],()[()],{{}}{{}}),>   而以下几个则不是: (,

css 506

车企自动泊车技术全解|纯视觉/多传感器融合双路线、端到端大模型革新 助力机械车位/无划线车位/极窄车位精准泊车落地

随着智能驾驶技术全面下沉,自动泊车已从高端车型专属配置,普及至十万级家用车型,成为车载核心刚需功能。但市面主流车企的泊车能力差距极大,核心差异源于传感器硬件架构、算法迭代逻辑、场景训练体系的全方位分化。传统规则式泊车算法仅适配标准划线车位,面对地库暗光、标线磨损、机械双层车位、极窄靠墙车位、无划线空地泊车等真实长尾场景极易失效。

getusushu的博客 105

一个完整的括号字符串定义规则如下: 1、空字符串是完整的。 2、如果s是完整的字符串,那么(s)也是完整的。 3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。

一个完整的括号字符串定义规则如下: 1、空字符串是完整的。 2、如果s是完整的字符串,那么(s)也是完整的。 3、如果s和t是完整的字符串,将它们连接起来形成的st也是完整的。 例如,"(()())", ""和"(())()"是完整的括号字符串,"())(", "()(" 和 ")"是不完整的括号字符串。 牛牛有一个括号字符串s,现在需要在其中任意位置尽量少地添加括号,将其转化为一个完整的

易大飞 2236

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

括号序列的dp问题模型

括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数。 ◦例如(())与()()都是合法的括号序列。 ◦ n<=3000。 在括号序列问题中,总是把左括号看作+1,右括号看作-1,要使括号序列合法,只需满足任意一个前缀和大于 或等于0,且总和为0即可 设dp[i][j]表示...

dbp123123的博客 1519

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

括号序列(5倍经验)

描述 Description定义满足以下规则字符串为规则序列,否则不是规则序列:1.空序列是规则序列;2.如果S是规则序列,那么(S),[S],{S}和也是规则序列;3.如果A和B都是规则序列,那么AB也是规则序列。例如,下面的字符串都是规则序列:(),[],(()),([]),()[],()[()],{{}}<>,([]<>{{}}),<<{}>>而以下几个则不是:(,[,],)(,

LOI__DiJiang的博客 648

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

dp泛做1

这里的dp范做根据网上的动态归法分析和网上的有个100个dp方程做的,题解很多是原版,没怎么动,有些是别人的一些其他做法,还有一些自己的想法。如果看到题解很别人一样,那就是摘自别人的。且这里只是一半。 由于本文有些摘自网上,如有原主看到不想在此贴出的,请说明,将会撤出。 如此文方法错误,或者冒犯某些原博主的文章还请见谅,还请指出,非常感谢 机器分配(HNOI’95) 0-1背包变形ty

lyc 14万+

LeetCode: Largest Number

string largestNumber(vector &num) { string result; if (num.size()==0){ return result; } bool allZero = true; vector strNum; for (auto& i:num){ strNum.push_back(to_string(i)); if (i != 0){

rreference 458
上一篇: poj 2243 Knight Moves
下一篇: poj 2470 Ambiguous permutations
JinbaoSite0144
博客等级 码龄12年 231粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值