如何确定动态规划的转移方程

Posted VR技术学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定动态规划的转移方程相关的知识,希望对你有一定的参考价值。



我流浪般的赤着双脚走来,

深感途程上顽石棱角的坚硬.

再加上那一丛丛拦路的荆棘,

使我每一步都留下一道血痕.

——食指:《热爱生命》1978




开篇点题

  1.  先观察最后一个状态

               比如 LintCode 114 ,题意是从一个二维数组的左上角走到右下角共有多少种不同的路径.且每次只能向下或者向右走一步,最后一个状态就是右下角

     2.  观察到达最后一个状态的前面的所有状态,它只能从该位置的上面或者右边过来,故前两个状态就是上面和右边的位置.

     3. 写出动态转移方程: f[i][j] = f[i-1][j] + f[i][j-1],其中f[i][j]代表走到位置的所有情况种数.

     4. 你没看错,那就是状态转移方程.

     5. 之后确定边界条件,什么叫边界条件?

     6. 比如左上角没有右边和上边,所以 f[0][0] = 1

        第一列和第一行只有一种到达的方式,横着走或竖着走,依次+1即可 

     7. 反过来从 f[0][0]开始使用状态转移方程计算就可以了,比如f[1][1] = f[0][1] +f[1][0]


代码见下:

class Solution {public: int f[110][110]; int solve(int m,int n){ for(int i=0;i<m;++i) f[i][0]=1; for(int i=0;i<n;++i) f[0][i]=1; for(int i=1;i<m;++i){ for(int j=1;j<n;++j){ f[i][j]=f[i-1][j]+f[i][j-1]; } } }  /** * @param m: positive integer (1 <= m <= 100) * @param n: positive integer (1 <= n <= 100) * @return: An integer */ int uniquePaths(int m, int n) { // write your code here memset(f,0,sizeof(f)); solve(m,n); return f[m-1][n-1]; }};

                


详细
  • 状态在动态规划中的作用属于定海神针

  • 简单地说,解决动态规划的时候需要开一个数组,数组的每个元素f[i]或者f[i][j]代表什么

  • 类似于解数学题中,X,Y,Z代表什么

那么依赖什么来确定状态呢?

  1. 最后一步

  2. 子问题

so.什么是最后一步?

       

以上是关于如何确定动态规划的转移方程的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-跳跃游戏I和II(动态规划)

Leetcode-跳跃游戏I和II(动态规划)

Leetcode-跳跃游戏I和II(动态规划)

动态规划初步

动态规划(下):如何求得状态转移方程并进行编程实现?

如何解决动态规划问题