Java实现算法之Brackets Sequence问题

Bracket Sequence 给定括号的对数和括号的种类求出最后合法序列的数量。如果只有一种括号序列就可以直接用卡特兰数。多种匹配的括号可以转换成同一种括号。 阅读详情

Problem:

Description

Let us define a regular brackets sequence in the following way:

1. Empty sequence is a regular sequence.
2. If S is a regular sequence, then (S) and [S] are both regular sequences.
3. If A and B are regular sequences, then AB is a regular sequence.

For example, all of the following sequences of characters are regular brackets sequences:

(), [], (()), ([]), ()[], ()[()]

And all of the following character sequences are not:

(, [, ), )(, ([)], ([(]

Some sequence of characters '(', ')', '[', and ']' is given. You are to find the shortest possible regular brackets sequence, that contains the given character sequence as a subsequence. Here, a string a1 a2 ... an is called a subsequence of the string b1 b2 ... bm, if there exist such indices 1 = i1 < i2 < ... < in = m, that aj = bij for all 1 = j = n.

Input

The input file contains at most 100 brackets (characters '(', ')', '[' and ']') that are situated on a single line without any other characters among them.

Output

Write to the output file a single line that contains some regular brackets sequence that has the minimal possible length and contains the given sequence as a subsequence.

Sample Input

([(]

Sample Output

()[()]

思路:动态规划问题

从这个问题重新总结实现动态规划问题的思路,首先确定子结构,因为动态规划问题的一大特性,就是子结构拥有父结构的全部性质,只是将问题规模变小了而已,那么我们就先找一下这个问题的子结构。当我们看到一个( 时首先看能不能旁边的匹配,然后看能不能和字符串中对应的位置进行匹配,也就是第一个和最后一个,显然括号匹配问题上来说,首尾匹配拥有更好的子结构的性质,因为如果首尾匹配成功的话,相当于转换成子问题,除去首尾后元素的匹配结果。这很好的具有子结构的特点。那么如果首尾不匹配的情况呢。那就说明,我首尾匹配的符号如果存在的话,一定在首尾中间,所以我们只需要遍历首尾中间的元素,然后以中间进行分隔,转换成求首到中间元素,和中间原素到结尾的需要添加符号数之和的最小值,来确定最优的中间解就好,这样也就很好的转换成了问题相同的子问题。然后我们定义一个二维数组time[i][j]用来记录元素从i到j所需添加括号的个数,我们依次写出状态转移方程:

if  time[i]==time[j]  则 time[i][j]=time[i+1][j-1] 这就是剔除首尾元素的子问题。 

if time[i]!=time[j] 则我们可以需要从中找出中间元素k, time[i][j]=min{time[i][j],time[i][k]+time[k+1][j]}使得time[i][j]最小。

最后我们就可以进行编程实现了。

public class bracketsSequence {

	public static void main(String[] args) {
		Scanner in =new Scanner(System.in);
		String line=in.nextLine();
		//子结构i和j  if ai==aj  a[i][j]=a[i+1][j-1]
		//if ai!=aj ai到中间某个值,和中间某个值到aj的添加次数之和,然后找到使数字之和最小的中间值
		//因此,采取一个二维数组来表示从i到j所需要添加的最小次数。
		int length=line.length();
		int [][]time=new int[length][length];//我们要注意我们定义的这个二维数组下半矩阵是没有数据的,因为我们是从i到j,i<=j
		for(int i=0;i<length;i++) {
			//注意这里一定要先把i i赋值为1,因为这是后面算法遍历不到的情况,这就是当只一个字母时,需要插入一个括号。
			time[i][i]=1;	
		}
		for(int step=1;step<length;step++) {//定义步数,先从小步完成,这样执行大步的时候,可以使用小步结果。
			for(int i=0;i<length-step;i++) {		
				int j=i+step;
				time[i][j]=99;//初始化为一个较大的值,方便找到最小的值
				if(match(line.charAt(i),line.charAt(j))) {
					time[i][j]=time[i+1][j-1];
				}else {
					for(int k=i;k<j;k++) {//找到中间能使插入最小的k
						time[i][j]=Math.min(time[i][j],time[i][k]+time[k+1][j]);
					}
				}
			}
		}
		
		for(int i=0;i<length;i++){//这里我输出了一下time数组方便理解
		System.out.println(Arrays.toString(time[i]));
		}
		System.out.println(time[0][length-1]);
		print(0,length-1,line,time);
	}
	public static boolean match(char a,char b) {
		if(a=='('&&b==')') 
		return true;
		if(a=='['&&b==']')
		return true;	
		return false;
	}
	public static void print (int i,int j,String line,int[][]d) {//采用递归的方法,输出
		//经典格式,先判断参数合法性,然后处理特殊情况
		if(i>j) return;
		if(i==j){
			if(line.charAt(i)=='('||line.charAt(i)==')') System.out.print("()");
			if(line.charAt(i)=='['||line.charAt(i)==']') System.out.print("[]");
			return;
		}
		int ans=d[i][j];
		//若前后两端匹配
		if(ans==d[i+1][j-1]&&match(line.charAt(i),line.charAt(j))){
			System.out.print(line.charAt(i));
			print(i+1,j-1,line ,d);
			System.out.print(line.charAt(j));
			return;
		} 
		//前后两端不匹配
		for(int k=i;k<j;k++){
			if(ans==d[i][k]+d[k+1][j]){
				print(i,k,line,d);
				print(k+1,j,line,d);
				return;
			}
		}
	}
}

结果:

([(] //输入
[1, 2, 3, 2]
[0, 1, 2, 1]
[0, 0, 1, 2]
[0, 0, 0, 1]
2
()[()]


存在问题:当我输入下面的情况时,结果明显不对。

所以这个问题也许不应该用动态规划来做,也许用栈来做才是对的

([)([])//输入
[1, 2, 1, 2, 3, 2, 3]
[0, 1, 2, 3, 4, 3, 2]
[0, 0, 1, 2, 3, 2, 1]
[0, 0, 0, 1, 2, 1, 0]
[0, 0, 0, 0, 1, 0, 1]
[0, 0, 0, 0, 0, 1, 2]
[0, 0, 0, 0, 0, 0, 1]
3
([()()[]])



AWR2243的等效相位中心与虚拟通道 在俯仰维方向上,不重合的虚拟通道有8个,排序为1:4,9:12。每个虚拟阵元之间的间隔为lambda/2。实际y轴方向虚拟阵列只跨越了8*lambda/2的距离。等效相位中心与虚拟通道类似,只是每个相位中心之间间隔为lambda/4,实际y轴方向等效相位中心只跨越了8*lambda/4=7.59mm的距离 阅读详情

相关推荐

手把手教你用Ubuntu 22.04的附加驱动工具安装NVIDIA显卡驱动(含常见错误修复)

本文详细介绍了在Ubuntu 22.04系统上,如何通过图形化的“附加驱动”工具安全、便捷地安装NVIDIA显卡驱动。内容涵盖从准备工作、禁用默认的nouveau驱动、图形界面安装实操,到安装后的验证(如使用nvidia-smi命令),并提供了安装失败黑屏、亮度调节失效等常见问题的深度解决方案,帮助用户彻底搞定驱动安装难题。

weixin_29248653的博客 602

POJ 1141 Brackets Sequence(JAVA版)

POJ 1141 Brackets Sequence 题目大意:给定一连串只包含"("、")"、"["、"]"的字符串,求至少添加多少个字符才能使该字符串变成一个规则的序列,并输出添加后的序列,这题一个字符串可能有不止一个答案,所以是Special Judge,不用担心(话说,当初因为这个纠结了好久)。 思路如下: import java.util.Scanner; public

爪哇D来客 653

UBUNTU使用RTL8811CU网卡(包含树莓派)

下载驱动 从绿联中下载:链接 下载解压后,chmod Linux文件夹 sudo chmod -R 777 ./Linux/ 修改系统的BOOT Secure为disable,参考链接:链接 sudo apt install mokutil sudo mokutil --disable-validation 重启电脑后,按照提示选择change secure boot state,并输入对应的字母(并不是全部密码,而是第几个),选择disable即可 进入Linux文件夹,运行命令 ..

Hot_Ant的博客 6246

【算法】bracket-sequence(DFS、DP)

给定一个长度为 n 的括号序列 S,其中有些位置上的字符缺失被换为 ∗,询问存在多少种将 S 中的 ∗ 替换为 ( 或 ) 的方案,使得 S仍然合法。若存在方案,输出字典序最小和最大的方案。 对于一个括号序列 A 而言,合法的定义为: ‘A = ()’ 是合法的 如果存在一个合法的 B,使得 ‘A = (B)’ ,则 A 是合法的 如果存在合法的 B,C,使得 ‘A = B + C’,其中 + 表示字符串的拼接操作,则 A 是合法的 输入格式: 输入一行长度为 n(1≤n≤5×103) 的括

○( ^皿^)っHiahiahia…的博客 1942

23. STM32F103C8T6 ADC采集光敏电阻传感器模块光照强度实战

本文详细介绍了如何使用STM32F103C8T6的ADC模块采集光敏电阻传感器的光照强度。通过硬件接线、核心原理讲解、四步代码配置(GPIO、ADC模式、使能校准、数据滤波)以及串口验证,手把手指导完成从模拟信号到数字值的完整实战流程,并重点提示了ADC时钟分频等关键配置要点。

weixin_42300144的博客 221

Eplan P8自动线号生成全攻略:从电位定义点到连接编号的完整流程

本文详细解析了Eplan P8自动线号生成的全流程,从电位定义点的创建配置到连接编号的标准化管理,帮助电气设计人员提升图纸规范性和工作效率。重点介绍了自动编号方案的定义与调整技巧,以及企业级标准化实施建议,是掌握Eplan P8自动线号功能的实用指南。

weixin_29254029的博客 510

Brackets Sequence POJ - 1141

Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a regular sequence, then (S) and [S] are both regular sequences. 3. If A and B are regular sequences, then AB is a regular sequence. For...

wan1314mum的专栏 312

生信实战|EffectorP3.0在植物病原菌效应子预测中的高效应用

本文详细介绍了EffectorP 3.0在植物病原菌效应子预测中的高效应用。通过机器学习模型,该工具能快速从海量分泌蛋白中批量预测胞质与质外体效应子,显著提升研究效率。文章提供了从环境配置、RNA-seq数据处理到批量预测的完整实战流程,并分享了结果解读与避坑指南,是生信研究人员进行病原物效应子鉴定的必备利器。

weixin_29195615的博客 302

CSUOJ 1271 Brackets Sequence 括号匹配

Description Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a regular sequence, then (S) is a regular sequ...

weixin_33951761的博客 177

Ubuntu双系统开机黑屏?3分钟搞定NVIDIA显卡驱动冲突(18.04/20.04实测有效)

本文详细解决Ubuntu双系统开机黑屏问题,特别是由NVIDIA显卡驱动冲突引起的故障。提供从临时进入系统到永久安装专有驱动的完整方案,适用于Ubuntu18.04/20.04用户,帮助快速恢复系统并优化显卡性能。

resnet7explorer的博客 309

QT实现OPCUA服务端客户端(附完整源码)

QT实现OPCUA服务端客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1821

POJ1141 Brackets Sequence

题目大意:定义一些规则序列:如果S是规则序列,那么[S]或者(S)也是规则序列,如果A和B都是规则序列,那么AB是规则序列。给出含有圆括号"()"和方括号"[]"的字符串 求添加最少括号的规则序列,并打印出来。 思路:含有重复子问题,递归动机的DP。 当字符串中ww[i]=='(' && ww[j]==')'  或者  ww[i]=='['&&ww[j]==']',那么显然只需要看dp[i+

muxi@Achilles的专栏 949

AXI总线详解完结篇

经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容。 所有文章的链接如下: 1、 AXI总线详解 2、AXI总线详解-总线和接口以及协议 3、AXI协议中的通道结构 4、AXI总线详解-AXI4读写操作时序及AXI4猝发地址及选择 5、AXI4交换机制 6、ZYNQ中DMA与AXI4总线-DMA简介 7、AXI总线详解-不同类型的DMA 8、AXI总线详解-DMA内部寄存器的读写方式 9、AXI总线详解-几种应用DMA的场合 10、Altera Scatter-G.

OpenFPGA的博客 5492

POJ 1141 Brackets Sequence【题解报告|有趣的区间dp】

今天很高兴,十几个清华本科和30个左右985专业第一,经过三天的角逐,终于让我拿到了清深的offer,夏令营的第一个收获!可以安心的九推冲击清软了 题目大意 给一些括号,求让它们合法最少要加上多少括号,并输出加上后的结果,合法的定义: 1.空串是合法的 2.若S是合法的,则[S]和(S)均是合法的 3.若A和B是合法的,则AB是合法的 思路分析 一道类似的区间dp问题,区间dp问题写的不多,右边这道回文子串算是一个,但是自己思维却是被这道题固化了,遇到最小括号匹配时也想用相同的dp方法来作,先附上我第一遍的

csyifanZhang的博客 458

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

1141Brackets Sequence结题报告

Brackets Sequence Time Limit:1000MS Memory Limit:65536K Total Submissions:23638 Accepted:6665 Special Judge Description Let us define a regular brackets sequ...

weixin_30455067的博客 118

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Brackets Sequence 括号DP

                  Brackets Sequence 题目抽象:给你一个括号字符串,要求你加入最好的括号使得括号匹配。输入匹配后的括号字符串。 分析:由已知的子区间推出大的区间。 cnt[i][j]表示原字符串[i,j]中至少需要加入的括号数。 ans[i][j]存储原字符串[i,j]匹配后的字符串。 特别注意输入的是空字符串。空字符串是匹配的字符串。 1 imp...

weixin_30699465的博客 89

poj1141Brackets Sequence (DP)

题目链接:http://poj.org/problem?id=1141 //poj1141 //题目意思,给出不一定规则的括号组合要把它们规则化 //这题用动态规划解决:定义两个二维数组num[i][j],pos[i][j], //分别表示i到j所要添加的括号数和i至j要分开的位置, //其中num[][]是为pos[][]服务的 #include&lt;iostream&gt; #inc...

java开发指南博客 【转载】 166

Brackets Sequence--poj--1141

Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11854 Accepted: 3164 Special Judge Description Let us define a regular brackets ...

java开发指南博客 【转载】 97

BNUOJ 1260 Brackets Sequence

Brackets Sequence Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged onPKU. Original ID:114164-bit integer IO format:%lld Java class name:Main Special Judge ...

weixin_30929295的博客 90

ZOJ 2604 Little Brackets DP

DP: 边界条件:dp[0][j] = 1递推公式:dp[i][j] = sum{dp[i-k][j] * dp[k-1][j-1] | 0&lt;k≤i} i对括号深度不超过j的,能够唯一表示为(X)Y形式,当中X和Y能够为空,设X有k-1对括号,则相应的方案数为dp[i-k][j] * dp[k-1][j-1] Little Brackets ...

weixin_34293141的博客 112

UVa 1626 (输出方案) Brackets sequence

正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规括号序列,并输出最优方案,多解的话输出任意一个即可。 设d(i, j)表示字符串s[i]~s[j]至少添加的括号的数量,则转移如下: S形如[S']或(S'),则转移到d(i+...

weixin_30894583的博客 145

UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)

题目描述: 定义合法的括号序列如下: 1 空序列是一个合法的序列 2 如果S是合法的序列,则(S)和[S]也是合法的序列 3 如果A和B是合法的序列,则AB也是合法的序列 例如:下面的都是合法的括号序列 (),  [],  (()),  ([]),  ()[],  ()[()] 下面的都是非法的括号序列 (,  [,  ),  )(,  ([)]

kalilili的专栏 836

Anthropic RRSM中间层归零:大模型架构的静默坍缩

在大模型服务架构中,'中间层'曾是弥合模型能力与硬件限制的关键抽象,其核心原理在于通过软件协调实现跨节点状态同步、请求路由与流式控制。随着GPU算力提升和CUDA内核编程成熟,这类中间件正从‘必要妥协’转向‘性能累赘’,技术价值大幅衰减。当前行业正加速向‘模型原生化’演进,将状态管理、中断响应、注意力调度等能力直接下沉至推理kernel与协议栈,显著降低延迟抖动、运维复杂度与语义失真。典型应用场景包括长上下文流式对话、低延迟实时交互及高可靠生产API集成。Anthropic对RRSM层的逻辑抹除,正是这一范

weixin_30684743的博客 353

UVA1626 - Brackets sequence括号序列 DP(输入输出好坑)

题目 Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a regular sequence, then (S) and [S] are both regular sequences. 3. If A and B a...

静女俟隅 456

Regular Bracket-sequence

【原题链接】 【题意说明】 构造合法的bracket-sequence。首先满足以下条件的序列是合法的bracket-sequence: (1)空串是一个合法的bracket-sequence; (2)若A是一个合法的bracket-sequence,则(A)、[A]、{A}都 是合法的bracket-sequence; (3)若A和B都是合法的bracket-sequence,则ABb...

weixin_30922589的博客 286

POJ-1141:Brackets Sequence(括号序列)

POJ-1141:Brackets Sequence(括号序列) 一、问题描述 Let us define a regular brackets sequence in the following way: 让我们用以下的方式来定义一个常规括号序列: Empty sequence is a regular sequence. 空的序列是一个常规序列 If S is a regular sequence, then (S) and [S] are both regular sequences. 如果S

soulandlove的博客 1417

UVA1626 Bracketssequence(括号匹配)

Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular sequence. 2. If S is a regular sequence, then (S) and [S] are both regular sequences. 3. If A and B are r

叶子心情你不懂 322
上一篇: 机器学习之循环神经网络(RNN)入门
下一篇: 机器学习理论篇之NormalEquation推导过程
NFMSR
博客等级 码龄11年 0粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值