1 你会学到什么?
在上一消息推送中,我们通过《装水最多的容器》这个实际问题,初步了解了动态规划的魅力所在,还记得如果我们枚举所有可能的容器高度和边长时得到算法时间复杂度很大,而经过仔细分析目标函数和其变量关系时,我们发现把初始值设置为最大底边长度乘以相对小的高度后,之后的迭代中最大面积的容器只可能出现在尽可能高的情况下,如下动画所示,初始值为12,然后动态地交替地调整两个边(指针),目的是牺牲底的长度,尽量获得大的容器高度,从而得到更大的容器,果然在索引为2,和5时,容器的最大高度为 24 。
在本推送中,我们继续体验动态规划这个算法思想,领域经过仔细分析思考后的算法性能的优越,往往直观的第一下想到的算法不是很优秀的算法,当然排除那些大牛,毕竟他们已经形成了优秀算法的思维,这是我们努力的方向。
2 讨论的问题是什么?
讨论动态规划思想到底该怎么应用到实际问题当中。怎么拿到一个问题,然后就能想到用动态规划区解决呢?
这次探讨的这个实际问题,比较有意思,是给出一堆括号,让你分析出最长的括号长度,当然是辨识出有效的括号长度。
3 实际问题描述
先看原题,摘自LeetCode官网:
Given a string containing just the characters ‘(’ and ‘)’, find the
length of the longest valid (well-formed) parentheses substring.For “(()”, the longest valid parentheses substring is “()”, which has
length = 2.Another example is “)()())”, where the longest valid parentheses
substring is “()()”