机器人走网格---限定向下或向右走

leetcode:62. Unique Paths

一、问题描述

机器人位于一个m x n网格的左上角(在下图中标记为“开始”)。机器人只能随时向下或向右移动。 机器人正在尝试到达网格的右下角(在下图中标记为“完成”)。有多少可能的独特路径?m和n的值最多为100。
【举例】
<例子1>:
输入: m = 3, n = 2
输出: 3
--解释:
从3*2格子的左上角出发, 一共有三条路线到达右下角:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right
<例子2>:
输入: m = 7, n = 3

输出: 28

二、解题算法

1、解题算法一:自顶向下常规dfs方法---大数据集超时

/******************************************
Author:tmw
date:2018-5-10
*******************************************/
#include <stdio.h>
#include <stdlib.h>

/**
    自顶向下dfs方法,空间复杂度O(n)---大数据集超时
    采用备忘录自顶向上的方法解决---详见算法导论P204-P210
**/

int memo[1000][1000] = {0};
int dfs_memo( int m, int n )
{
    if( m<1 || n<1 ) return 0; /**走到边界了,终止**/

    /**当方格只有一个时,路径只有一个**/
    if( m==1 && n == 1 ) return 1;

    /**
        到达m*n总路径数=到达(m-1)*n总路径数+到达m*(n-1)总路径数
    **/

    if( memo[m][n]>0 ) return memo[m][n]; /**最优结果有存储,则直接返回**/
    else
        memo[m][n] = dfs_memo(m-1,n)+dfs_memo(m,n-1); /**不直接跳到上一层,而是将结果存起来**/
    return memo[m][n];
}

int uniquePaths(int m, int n)
{
    return dfs_memo(m,n);
}

1、解题算法二:动态规划方法---自底向上

/**
    动态规划方法---自底向上  --想象成一个倒金字塔结构,最底为皇帝,皇帝问左右大臣(自底向上)
    定义f[i][j]表示从起点[1,1]到达终点[i,j]的所有路径数
    则:f[i][j] = f[i-1][j]+f[i][j-1]
**/

int uniquePaths(int m, int n)
{
    /**定义一个结果数组**/
    int f[1000]={0};

    int i,j;
    f[0] = 1;

    /**逐次加行**/
    for( i=0; i<m; i++ )
        for( j=1;j<n;j++ )
            f[j] = f[j] + f[j-1];  /**目标位置为n,假设这时已经到达n-1的位置,那么到达n位置
                                    的所有路径f[j]=到达n-1位置的所有路径f[j]+n-1位置到n位置的路径和f[j-1]
                                    即:f[j](后一个位置的所有路径) = f[j](前一个位置的所有路径)+f[j-1]
                                    **/

    return f[n-1];
}


梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~

猜你喜欢

转载自blog.csdn.net/qiki_tangmingwei/article/details/80950138