zjnu(1183)——括号序列【基础算法・动态规划】——高级

一道关于括号序列的动态规划题目,通过计算添加最少括号数使序列合法,介绍了两种定义dp状态的方法,并提供了求解思路和初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我只想声明一点,这道题有毒。。。我用char读入就错了,然而换成string读入就对了或者可以把定义char的数组开的大一点,原先1A的一题硬是纠结了老半天。

传送门:zjnu

题意:

就是对于一个组成的序列,添加尽量少的括号得到一个规则序列,并且输出这个序列的长度。

不过我学到了两种定义dp状态的方法:

1)定义dp[i][j]为i~j中需要添加的最少的括号数。这里我们记录s为一段字符的开始位置,e为一段字符的结束位置。

     ①当(a[s]=='('&&a[e]==')')||(a[s]=='['&&a[e]==']')时,dp[s][e]=min(dp[s][e],dp[s+1][e-1]); 

     ②当(a[s]=='('&&a[e]!=')')||(a[s]=='['&&a[e]!=']')时,dp[s][e]=min(dp[s][e],dp[s][e-1]+1);

     ③当(a[e]==')'&&a[s]!='(')||(a[e]==']'&&a[s]!='[')时,dp[s][e]=min(dp[s][e],dp[s+1][e]+1);

     ④然后当两个数中间还有其他数存在的时候,那么我们就用for,像石子归并那样,然后去更新dp[s][e]

最后输出的时候只要输出dp[0][len-1]+len就好了。

#include<stdio.h>
#include<string.h>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值