dp
为了准备下半年区域赛名额,重新拾起泰难的dp。也学习了Java的语法,今天把循环那听完了。
那就写几个dp的经典问题和他们各自的优化方式吧。
1.01背包问题
我们从最简单的状态转移方程推起,dp[i][j]表示前i个物品且背包体积为j时的最大价值。那么我们可以很轻松的推出他的状态转移方程
dp[i][j]=max(dp[i-1][j],dp[i-1][j-v]+w);
其中比较经典的一个优化方式是由于只用到了i和i-1层的状态,所以我们可以用滚动数组的方式来优化,但是本蒟蒻还没有学过,先不写了。
第二种就是压缩一个维度,把第一个维度删掉,dp[i]此时表示在小于等于i的背包容量下的最大价值。
此时他的转移方程就变成了dp[i]=max(dp[i],dp[i-v]+w);但是需要注意的是,我们原来是正序遍历j的,也就是容量。但二维的状态转移方程是需要i-1层的j-v.而如果我们在压缩完维度之后仍然选择正序的话,我们会覆盖掉原来被更新过的j-v;(因为j是正序遍历的话,j-v<j,因此我们相当于使用的是第i层的状态,不符合原来的数据)因此我们倒序的遍历j;
浙公网安备 33010602011771号