第七周区间dp加背包

上周就开始学区间dp了,上周没有总结学习的感悟,写了自己感受。这周就来写区间dp加背包问题的学习感悟。
首先,区间dp学习了三种模型,第一种模型就是大区间分成最优小区间求解,以石子合并题作为特征例题,dp[i][j]=min(dp[i][k]+dp[k+1][j])+sum[j]-sum[i-1]。做题目做到了一个这个模型的升级版。能量项链问题,就是环形拆分,解决这个问题就是用加长数组来解决。第二种模型就是根据要求可以把区间分成[i+1,k-1][k+1,j]情况。以括号匹配题为特征例题,dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k+1][j]+2)还有较简单的第三种模型,只考虑左右边界情况的模型。以屌丝上场题为特征例题。dp[i][j]=min(dp[i][j],dp[i+1][i+k-1]+a[i]*(k-1)+dp[i+k][j]+(sum[j]-sum[i+k-1])*k)。
其次,背包问题可以分为,01背包问题,完全背包问题,多重背包问题,分组背包问题。01背包就是最基本的背包问题,特征就是每种物品仅有一件,可以选择放还是不放。代码第二重循环就是从大到小。这种例题就多了去。完全背包题就是升级版01背包,它的特征就是每种物品可以无限件使用。代码第二重循环恰恰相反是从小到大。这周就做到了一题稍加改变的完全背包题,就是加了一个限制条件可以取多件不能无限取。多重背包问题。可以通过条件转换,化为多重背包,01背包。分组背包问题,每组物品有若干种策略,选本组的某一件,或者一件不选。第一重循环所有组k组,第二重循环从大到小,第三重循环是所属k组里的i。
通过做题目,发现区间dp问题写循环的话比写动态方程更好写一些,背包问题写动态方程比写循环好写一些。这周最让我记忆深刻的是,有一题代码,通过提交20来此次才发现每次输入测试数据计算都需要重新初始化dp数组和另一个数据数组。以前写dp代码还没碰到连数据数组都要重新初始化的问题这个问题,现在碰到了就要注意起来了。报名了星期一的比赛,到了星期一就可以试试这个比赛的感觉。学长说比赛是次要补题才是关键,可能只有自己试试了才知道这句话的真正含义吧。

发布了23 篇原创文章 · 获赞 0 · 访问量 319

猜你喜欢

转载自blog.csdn.net/qq_45762392/article/details/105613114