[poj] 动态规划 1141

本文详细解析了一道使用动态规划(DP)解决的复杂序列问题,包括数组初始化、路径保存策略、边界条件处理及递归输出路径等关键步骤。作者分享了在处理类似[][]串时避免错误的方法,并强调了使用memset进行数组初始化的便利性。通过实例,文章展示了如何优化DP算法,提高解题速度。

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

dp练习的第三道题,依然花了我断断续续好几个小时……

 

有人说看到题目里的:

 

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.

 

就知道用dp,看来我还是经验太少了

 

跟上一词做的题目有点像,都是用一个二维数组保存状态,另一个保存路径。保存路径的那个我想了好一阵怎么来存,结果最后还是看了别人的方法才作对……

 

1. memset来数组初始化这个方法好像非常方便,不知道有没有什么弊端。

 

2. 二维数组的遍历方式是类似(0,1)(1,2)(2,3)-->(0,2)(1,3)-->(0,3)这样,所以在下标处理上需要很谨慎。

 

3. 需要注意的是,当i和j的bracket匹配时,不能简单的直接dp[i][j]=dp[i+1][j-1],需要判断dp[i+1][j-1]与其他分割方式的最小值,防止在处理类似“[][]”的串时做错。

 

4. 另外,按照path数组输出的时候,用了递归的方式。主要的思想是:按照path数组走的时候,按照子问题来进行输出。因为是dp是把问题划分为各个子问题的,所以按照子问题来输出是非常方便的方法。具体的处理中,分为path[i][j]值为-1或者不为-1两种,为-1的时候说明是在path[i+1][j-1]外加上了两边的符号,也就是[A]或者(A)的情况;如果不为-1,则说明是按照中间某一个划分来输出,是AB分为A和B的情况。

 

最后,希望以后做题的速度能快一些……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值