这个周的学习主要以动态规划内容为主,学习了背包(0-1背包,滚动数组,完全背包),递推与记忆化搜索,关于LIS的三种解法有了更充分的了解。
关于背包中的-背包问题,我觉得这个公式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-obj[i].vol]+obj[i].value)非常重要,关于之后完全背包,多重背包的问题中公式基本由此延伸而来。
关于滚动数组,编写过程中需要注意的一共有两个点,一个是状态覆盖时要从后往前覆盖,至于书上所说的从后往前覆盖的必要性我还是不太能理解,我所认为从后往前覆盖是为了避免某些物品因为一开始为0的背包大小而没有被统计上。第二个需要注意的点是滚动数组只能用来求最终答案,过程中子问题的答案已经被覆盖掉了,也就是所谓信息损失。
关于LIS,这个的求法有三种,第一种利用LCS求解,第二种直接dp[i]=max(0,dp[j])+1表示以第i个数字为结尾的LIS长度。第三种非DP方法融合了分治和二分的思路,但是这种方法只能求出LIS的长度却不能求出具体的LCS。
关于递推与记忆化搜索,这是动态规划中体现递归思想最为充分的地方。(这个方面我还没学完,明日补上)