美文网首页
动态规划

动态规划

作者: Jaunez | 来源:发表于2020-06-27 21:52 被阅读0次

动态规划是解决大多数复杂问题的一种解题思路,其操作步骤和递归算法类似,都是先从问题本身抽象出规律,并整理出计算公式,然后从公式出发,使用递归算法、递推或者记忆搜索法等算法进行求解。

万恶的数塔问题

1.问题描述

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

现从首行走到末行,每次只能往下或者往右走一格,求如何行走使得各位上数字之和最大

2.分析

假定f(i,j)表示第i行第j列位置的最大值,则欲求f(1,1),则必须知道f(2,1)和f(2,2)中最大值,然后取其中最大值加上7,则是f(1,1)。于是有了:
f(i,j) = \begin{cases} A[i][j] & i=n(本题中n=5)\\ max(f(i+1,j),f(i+1,j+1)) + A[i][j] & i<n \end{cases}

3.代码

根据2中的分析,得到了公式,根据公式可以写递归、递推和技术搜索法三种算法:

1.递归算法

int f(int i, int j){
  if(i == N){
    return A[i][j];
  }else{
    return A[i][j] + Math.max(f(i+1,j),f(i+1,j+1));
  }
}

2.记忆搜索法

int MEM[N][M];
int f(int i, int j){
  if(i == N){
    return A[i][j];
  }else if(MEM[i][j] != 0){
    return MEM[i][j];
  }else{
    MEM[i][j] = A[i][j] + Math.max(f(i+1,j),f(i+1,j+1));
    return MEM[i][j];
  }
}

3.递推

int MEM[N][M];
int f(){
  for(int i=0;i<N;i++){
    MEM[N-1][i] = A[N-1][i];
  }
  for(int i=N-2;i>=0;i--){
    for(int j=0;j<=i;j++){
      MEM[i][j] = Math.max(MEM[i+1][j], MEM[i+1][j+1]); 
    }
  }
  return MEM[0][0];
}

ATTENTION: 由递归转为递推,可以使用列表法实现,先将已知条件列举出来,然后根据递归公式,一步步求解未知条件【注意边界条件的考虑】

相关文章

网友评论

      本文标题:动态规划

      本文链接:https://www.haomeiwen.com/subject/astbfktx.html