機器人走網格---限定向下或向右走

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];
}


夢想還是要有的,萬一實現了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章