现在的位置: 首页 > 综合 > 正文

12-2-24关于动态规划的一点个人总结

2018年01月11日 ⁄ 综合 ⁄ 共 940字 ⁄ 字号 评论关闭

1,动态规划算法,类似分治算法,都是分成如干个子问题,动态规划的一点优势就是可以随时参考前面步骤的子问题的结果,这就使得各个子问题不是相互独立的。

了解了上述思想,那我们将如何分子问题。这一步很关键,关系到我们后续的编码。

最熟悉的莫过于是矩阵连乘,这里的分解的思想是 假设我们在第k个矩阵处 进行分割该矩阵序列,这样分成了两个子问题,并且具有最优子结构。按照这样的规律,继续分解下去。在后期进行编码的工作中,我们只需要一个m[i][j]来代表 第i个矩阵到j个矩阵的连乘的最少次数。其中i==j,是等于0的,不需要任何计算。通过我们一系列的循环,就会逐步填满二维矩阵。一切都瞑目了然。

了解了第二步思想。那么我们如何确定k,这里只需要一个for(k=i+1,k<=j;k++),进行逐次对比m[i][j],找到最优的m[i][j]

在第三步思想后,我们也许还会怀疑,这些子问题是如何相互借鉴的,其实我们从宏观的角度来观察,就单独看m[i][j]的二维矩阵。m[i][j]=m[i][k]+m[k][j]+p[i-1]*p[k]*p[j]

这里的m[i][j]很显然要借鉴m[i][m],其中m比j是绝对小于等于的。因此我们在进行二维数组的循环的过程,是从小到大的循环的。

下面我们再来看移到微软之美的饮料供货的 动态规划算法。

这里我们分子问题,是假设有k个第j种饮料,作为单独的子问题。那按照这样的思想,找第j+1种饮料有多少个。

这里我们还是利用的二维数组opt[v][j],这里表示的意思,在供应饮料总容量为v的前提下,第j,j+1....n这些饮料的某种组合可以让客户达到最大的满意度

一旦明确k的意思所在了之后,我们这里继续采用for(int k=0;k<=c[j];k++),进行一个循环来判定比较哪个k是最适合我们题意的

还一个问题,在进行遍历我们这个二维数组的时候,采用增序还是减序,其中opt[v][j]=opt[v-k*v[j]][j+1]+k*h[j];透过这个表达式,我们发现

j是需要是从大到小的,而我们的v采用是从小到大  for(int j=T-1;j>=0;j++) for(int k=0;k<=v;k++)

关于动态规划我们如果知道这些要点,是足够我们写出相应的代码。重点是灵活应用。

抱歉!评论已关闭.