不同路径--动态规划

题目:

不同路径:每次只能向下或者向右移动,从左上角出发到达右下角,共有多少条不同的路径?

思想:

其实针对此问题我们可以用动态规划的思想来解决,对于第一行和第一列来说,只有一条路径,所以初始化为1

                                                                             

接着我们可以观察看出,到达dp[1][1]的路径主要可以和dp[1][0]和dp[0][1]有关,到达这两点后对于通向dp[1][1]是一样的,所以我们可以推导出到达当前点的路径数和它的同行前一列前一行同列的路径数有关,即:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

                                                                             

 int uniquePaths(int m, int n) 
{
    int **dp = new int*[m];//先使一个二级指针指向数组指针的地址

	for(int i = 0 ; i < m ;++i )
	{
		dp[i] = new int[n]();//为一级指针分配地址
	}

    for (int i = 0; i < n; i++) dp[0][i] = 1;
    for (int i = 0; i < m; i++) dp[i][0] = 1;
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
    }
    return dp[m - 1][n - 1];  
}

 int main()
 {
	 int m,n;
	 cin >> m >> n ;
	 cout << uniquePaths(m,n) << endl;
 }

  结果如下: 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值