码迷,mamicode.com
首页 > 编程语言 > 详细

动态规划算法相关问题

时间:2018-11-01 22:19:55      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:计算   构造   自底向上   str   max   很多   交流   基本   避免   

1.对动态规划算法的理解

基本思想:

       动态规划算法是将待求解的问题分解成若干个子问题,先求子问题,然后从这些子问题的解得到原问题的解。但与分治法不同,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。为了避免有些子问题被重复计算了很多次,可以用一个表来记录所有已解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。

基本步骤:

(1)找出最优解的性质,并刻画其结构特征

(2)递归地定义最优解

(3)以自底向上的方式计算出最优解

(4)根据计算最优值时得到的信息,构造最优解。

基本要素:

(1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

(2)重叠子问题:动态规划算法利用子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格里,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。

(3)备忘录方法:备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。备忘录方法的递归方式是自顶向下的

2.编程题

(1)编程一递归方程:

for (int i = 1; i < n; i++) {
      for (int j = 0; j < i; j++) {
            if (a[i] > a[j] && m[j] + 1 >m[i]) {
               m[i] = m[j] + 1;

               if (max < m[i]) {
                   max = m[i];
               }
            }
      }
}

(2)编程二递归方程:

for(m=2;m<=n;m++) {    //到第m个站点
     for(int i=1;i<=n-m+1;i++) {    //从每一个站点开始
          int j=m+i-1;     //r(i,j)的长度为j
          for(k=i;k<=j;k++) {   //找出某一站k,使r(i,k)+r(k,j)最小
               min=a[i][k]+a[k][j];
               if(a[i][j]>min) {
                  a[i][j]=min;
               }
           }
     }
}

3.结对编程情况

其实跟队友线下交流编程还是蛮少的,不过遇到问题的时候还是可以找队友互相讨论,一起解决。

动态规划算法相关问题

标签:计算   构造   自底向上   str   max   很多   交流   基本   避免   

原文地址:https://www.cnblogs.com/winkey/p/9879716.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!