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];
}
夢想還是要有的,萬一實現了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~