博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA代码—算法基础:采用动态规划(DP)求解Unique Paths问题
阅读量:4041 次
发布时间:2019-05-24

本文共 2063 字,大约阅读时间需要 6 分钟。

采用动态规划(DP)求解Unique Paths问题

问题描述

原题链接:

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

How many possible unique paths are there?

这里写图片描述

Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

问题分析

这个题目是从一个3*7的矩阵(方格)中,找出从左上角到右下角的所有可能路径。每次在方格矩阵中移动位置时,只能向右或者向下移动。

左上角的位置记为 [0,0],只有一行时,移动的位置可以表示为:[0,i] (i = 0..i);只有一列时,移动的位置可以表示为:[j,0] (j = 0..j)

当从第 [i,j] 位置开始移动时,其下一个位置只能向右,或者只能向下;则位置可以表示为:[i+1,j],或者 [i,j+1];反过来想想,从第 [i,j] 位置反推来时的位置,要么是从上面的格子走过来的,上面的格子坐标可以表示为:[i,j-1];要么是从左边的格子走过来的,左边的格子坐标可以表示为:[i-1,j]。

我们假设给第1行和第1列的格子赋初值均为 1。为什么第1行的格子和第1列的格子都赋值1呢?如下图所示:

这里写图片描述

因为从(0,0)向右移动到(0,1)位置只有唯一的一种走法;从(0,0)移动到(1,0)也只有唯一的一种走法。

反过来想,如果机器人现在在(2,0)位置,那么从上一个位置(1,0)到当前位置(2,0)也只有唯一的一种走法。
所以,第1行的任何一个格子,或者第1列的任何一个格子,都可以被标记为1。(因为只有1种走法)

但是如果从(0,0)位置移动到(1,1)位置呢? 有两条路径:

第1条:(0,0)移动到(0,1),再移动到(1,1)
第2条:(0,0)移动到(1,0),再移动到(1,1)
那么位置(1,1)的值可以标记为2。

余此类推,除第一行,第一列的所有格子之外,单元格的值可以表示有几条路径可以达到该单元格。

这里写图片描述

好了,至此,问题从对于一个M*N的矩阵,从左上角(0,0)移动到右下角(m,n)时有多少条不同的路径,可以转化为从(m-1,n-1)移动到(m,n)有几条不同的路径。

状态转移方程为: dp(m,n)= dp(m-1,n)+dp(m,n-1)

算法设计

package com.bean.algorithmbasic;public class UniquePathsDemo {    /*     * m和n最大不超100。     * */    public static int uniquePaths(int m, int n) {        int[][] result = new int[m][n];        // 第一列的解        for (int i = 0; i < m; i++) {            result[i][0] = 1;        }        // 第一行的解        for (int i = 1; i < n; i++) {            result[0][i] = 1;        }        // 其它位置的解        for (int i = 1; i < m; i++) {            for (int j = 1; j < n; j++) {                result[i][j] = result[i - 1][j] + result[i][j - 1];            }        }        // 所求的解        return result[m - 1][n - 1];    }    public static void main(String[] args) {        // TODO Auto-generated method stub        int result = uniquePaths(3, 7);        System.out.println("RESULT IS: " + result);    }}

计算结果为:

RESULT IS: 28

(完)

你可能感兴趣的文章
linux 驱动开发 头文件
查看>>
/etc/resolv.conf
查看>>
container_of()传入结构体中的成员,返回该结构体的首地址
查看>>
linux sfdisk partition
查看>>
ipconfig,ifconfig,iwconfig
查看>>
opensuse12.2 PL2303 minicom
查看>>
网络视频服务器移植
查看>>
Encoding Schemes
查看>>
移植QT
查看>>
如此调用
查看>>
计算机的发展史
查看>>
带WiringPi库的交叉编译如何处理一
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Spring事务的七种传播行为
查看>>
ES写入找不到主节点问题排查
查看>>
Java8 HashMap集合解析
查看>>
欢迎使用CSDN-markdown编辑器
查看>>
Android计算器实现源码分析
查看>>
Android系统构架
查看>>
Android 跨应用程序访问窗口知识点总结
查看>>