初识动态规划,我对这个算法的理解是这样的:

1.找到初始值-原始解

2.在找到各种解与原始解的关系

3.通过循环得到答案

 

适用于动态规划的问题首先就是不同路径:

问题是给定一个M*N的地图从左上到右下角一共有多少种不同的方案(每次只能向右或者向下走一格)。

那么解决这个问题的关键在于你如何确定初始解与答案之间的联系。

首先我们可以确定地图的左边与上边都为1,因为只能往右或者下走。

例如从【0,0】走到【0,5】只能选择连续向右走五步,或者从【0,0】走到【5,0】只能选择连续向下走五步。

那么走到【1,1】有多少种走法? 根据每次只能向下走一步或者向右走一步的特性,所以只能由【0,1】或者【1,0】到达【1,1】。也就是说【1,1】的走法就是【1,0】的走法加上【0,1】的走法。

其他类似,只需要知道左边与上面的格子的走法也就知道本格子的走法了。

 

这时我们设置一个二维数组DP【】【】,表示从【0,0】到【i,j】之间有多少种走法。

那么结合之前的分析可以得知DP【i】【j】 = DP【i - 1】【j】 + DP【i】【j - 1】

 

代码如下:

    public int uniquePaths(int m, int n) {
        int DP[][] = new int[m][n];
        for(int i = 0; i < m; i++)
            DP[i][0] = 1;
        for(int i = 0; i < n; i++)
            DP[0][i] = 1;
        for(int i = 1; i < m; i++)
            for(int j = 1; j < n; j++)
                DP[i][j] = DP[i - 1][j] + DP[i][j - 1];

        return DP[m - 1][n - 1];
    }

 

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/Yeqqsy/p/16405712.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!