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];
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~