2021-04-10

2021-4-3
线性dpˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇˇ(最后有概括)
—>(同学们🤔,别点返回😝,看完这句话😄,这篇文章虽长(也就2k,不到10分钟就可以看完。)😬,但通过几个典型例题和思路😁,可供初学者快速了解简单dp😃,请同学们按需取舍😊)<—*
课上内容总结
1,吃金币问题。

题意,在笛卡尔坐标系中,从最初的原点出发到(n,m)处截止,每次可以走一步,每个格子中有金币,金币数量不相同,可以选择向下走,或者是向上走,不能返回,求出到终点时的最大金币数量。

理解,每个格子都有不同金币,所以如果按照排序,只去找每行的最大值相加,结果会失去很多金币,所以不能从最大值考虑。如果从正面考虑,只能精确到下一步的最大值,而无法看到之后几步的最值,所以这类题目多用从后向前的递归公式进行求解。

思路,从最后一个点开始,如果到最后一个点的金币数量最多,那么这个路径一定是金币数量最多的路径,如果去掉最后一个格子,那么这个路径的金币数量也一定是最多的,所以依次类推。如果是从最后一个格子的上方下来的,那么,如果去掉这个格子,也是从这个格子的上方或者是左边过来的路径中一个是有最大金币数的。所以递归公式是dp[i1][i2]=max(dp[i1-1][i2],dp[i1][i2-1])+a[i1][i2],问题是怎样实现由负向转换为正向。从原点开始这个点是从上一个点过来的,于是就用上述公式,for(i1<=n){for(i2<=m)}

总结,这题是典型从正面考虑,然后无法计算后面的状态,所以应该从后向前退,而且应该有同学问,既然是从后向前推,温室莫不是从终点向前,!!如果从i1i2终点开始,那就和从原点到终点是一样的。所以还是从开始来,只不过这一点的状态,是通过上一点的决策来决定的。
注意,不是从该点选择右边还是下边的点,而从该点判断上一个点。
2,最长公共子序列

题意,给出两个子序列,可以是字符串,也可以是由数字组成的子序列,(一定注意两个字符串得长度可能不一样,不要想当然的认为是一样的),要求求出两个字符串中最长的公共子序列。

理解,首先搞清楚子串和子序列的区别,子串只能是连续的,而子序列可以是连续也可以是不连续的。但是无论是子串还是子序列都无法改变顺序。子序列的情况太多了,无法用循环表达。

思路,从整体来看是较为困难的,所以可以从a字符串的前j个字符和b字符串的前k个字符来看,不难看出,如果a【i】=b【j】的话,那么截止到这个字符的最大值一定是a【i-1】和b【j-1】的最大值,所以用一个二维数组来表示a的前i个和b的前j个,如果a【i】和b【j】不相等话,那么可以说在最大字符串中可以没有a【i】或者是b【j】那么这一点的最大值就是a【i-1】【j】或者是b【i】【j-1】中较大的一个,因为只是求出最大相同子序列求道后面的值的时候与前面的字符没有关系,所以只一点只表示截止到这一点相同子序列的最大值即可。

总结,向这种两个相比较的一般如果直接从最后整体来看是无法求解的,所以采取递推公式。像这种两个求方案数的多采取一个二维数组,其中列表示a行表示b从a的i开始到b的j结束来观察。
3,最大子矩阵和
题意,给定一个矩阵,每个坐标都对应一个数,要求取出一个子矩阵。使得子矩阵的每个元素组成的和最大。

理解,如果采取暴力的做法是可以行得通的。但考虑到时间限制和代码太过复杂一般做这种题,暴力做法是不可以的。因为子矩阵是连续的,所以可以将每一列的值都累加,累加到最顶上那一行,或者是将每一行的元素值都累加到每一行的开始或者是终止。然后将二维转化为一维然后就是求每一行的连续子串的最大值即可。

思路,从原点开始,第一层循环是第几行,第二层循环是终止的第几行数,然后将两个行之间的都累加到最顶上一层,然后进行每一行的连续最大值求出来。

总结,如果只考虑子矩阵的情况,那要从11,12,13,21,2*2等等,这样会被困在子矩阵中。但是如果将每一列的值进行累加到最顶上的一行,然后再照连续的最大值,结果就是一个子矩阵。对待这种题,没有好的思路,只有当做过等下次遇到类似的才会有思路。就是开始时,没有任何思路,但是找到题目中的限制条件,然后找找破解限制的方法,和之前学过得方法进行联系,联系完,看看能不能是开始的解

dp初步了解:问题多表现为求最值,求方案数,两个相关条件找最值。解题方法比贪心要更为直观。解题思路与贪心有较大区别。贪心多表现为求最值,且多排序,而无法看到下一步。而dp多为顺序求值,而该点的状态由上一步决定。贪心问题多变,较难理解,个人认为贪心想要做好需要大量时间积累。1,dp每一个点都会对应一个状态,这个状态就是要求的解,所以做题时,可以直接讲该点的状态值算出,观察与前一个值的关系。2,每一状态都会有一个决策,这个决策决定下一个元素的状态值。而解题时有时会用到倒推的思想,即这点的状态值是怎样由上一个点来形成的。3,状态转移方程绝对会与之前元素的状态值建立联系,是解题必不可少的。4,复杂dp求解需要结合多重知识,如求子矩阵和问题,然后转为简单dp。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值