给定一个矩阵m*n,从左上角开始每次只能向右和向下走,最后到右下角的位置共有多少种路径。
#include <bits/stdc++.h>
using namespace std;
/*
每次只能向右或向下走
dp[m][n] = dp[m-1][n]+dp[m][n-1];表示走到(m,n)位置的走法
这道题求有多少条路径?那么理所应当想到动态规划。
我们令dp[i][j]是到达i,j最多路径
动态方程:dp[i][j] = dp[i-1][j]+dp[i][j-1];
和上面的公式是一样的
对于第一行dp[0][j]和第一列dp[i][0],由于都是在边界,所以只能为1
时间复杂度O(m*n)
空间复杂度O(m*n)
*/
int uniquePaths(int m,int n)
{
/*
dp[i][j]是到达i和j最多的路径
但是为什么i=0的时候 都要弄成1呢?
因为这是初始化过程最上面和最左边的都是1
*/
vector<vector<int>> dp(m,vector<int>(n,0));
for(int i = 0;i<m;i++)
dp[i][0]=1;
for(int j = 0;j<n;j++)
dp[0][j]=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];
}
/*
优化1:
由于dp[i][j]=dp[i-1][j]+dp[i][j-1],因此只需要保留当前行与上一行的数据(在动态方程中,即pre[j] = dp[i-1][j]),空间复杂度O(2n)
其实就是:
当前的状态只跟上一行的状态和同一行左边的状态相关。所以我们只需要维护上一行的数组,和当前行的数组。那么pre就是上一行的状态(整行),cur就是当前行的状态。
*/
int uniquePaths1(int m,int n)
{
vector<int>pre(n);
vector<int>cur(n);
//初始化 把所有的值都填成1
for(int i = 0;i<n;i++)
{
pre[i] = 1;
cur[i] = 1;
}
for(int i = 1;i<m;i++)
{
for(int j = 1;j<n;j++)
cur[j] = cur[j-1]+pre[j];
}
return cur[n-1];
}
/*
优化2:
cur[j] += cur[j-1];即cur[j] = cur[j]+cur[j-1];
等价于思路二: cur[j] = pre[j]+cur[j-1];
因此,空间复杂度为O(n)。
*/
int uniquePaths2(int m,int n)
{
vector<int>cur(n);
for(int i = 0;i<n;i++)
cur[i] = 1;
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
cur[j] += cur[j-1];
}
}
return cur[n-1];
}
int main()
{
int m = 5,n = 8;
int num = uniquePaths2(m,n);
cout<<num<<endl;
system("pause");
return 0;
}
给定一个矩阵m*n,从左上角开始每次只能向右和向下走,最后到右下角的位置共有多少种路径。相关推荐
- 给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置
/* * 给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置, * 路径中所有数字累加起来就是路径和,返回所有路径的最小路径和,如果给定的m如下,那么路径1,3,1,0,6 ...
- 给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置共有多少种路径
题目描述 给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和. 思路: 1.排列组合 要从A到B,必须向左走6 ...
- [分支限界]给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置共有多少种路径
分支限界解最短路径 问题描述: 要求: 随机数算法 分支限界算法 程序源码 问题描述: 给定一个m行n列的矩阵,从左上角开始每次只能向右或向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这 ...
- [算法]给定一个矩阵m*n,从左上角开始每次只能向右或者向下走,最后到右下角的位置共有多少种路径
很经典的一道题 等同于:https://leetcode-cn.com/problems/unique-paths/ 在完美世界面试中遇到了. 每次都只能向右或者向下走,求出所有种情况. 当时想到的思 ...
- 请编写一个函数,计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和向下走,不能往左和往上走。
请编写一个函数,计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和向下走,不能往左和往上走. 递归实现: # ...
- M×N的矩阵,从左上角走,只能向右或者向下走,要求走过的每个元素的值加起来的和最大,步数不限
题目描述 M×N的矩阵,从左上角走,只能向右或者向下走,要求走过的每个元素的值加起来的和最大,步数不限 代码实现 import numpy as np def max_way(a,m,n):dp=[[ ...
- 一个m * n的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子
格子路径 题目: 在一个 2×2 的栅格中,从左上角出来,只能向右或向下移动,总共有 6 条路径可以到达栅格的右下角: 求m*n的网格中,有多少条移动路径? 以一个 20×20 的栅格为例,它有137 ...
- 给定一个m*n的格子或棋盘,问从左上角走到右下角的走法总数(每次只能向右或向下移动一个方格边长的距离。
比如一个2*3的矩阵, 1 2 3 4 5 6 从1出发走到6,则可能的走法为:1 2 3 6, 1 2 5 6, 1 4 5 6共有三种. 这道题可以看成是深度优先遍历一颗树.解法为: public ...
- Leetcode:62题 不同路径(一个机器人位于一个 m x n 网格的左上角 。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角)
题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为"Start" ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为&q ...
最新文章
- JavaScript碎片—函数闭包(模拟面向对象)
- PHP和MySQL入门(8)
- mac之自己摸索的常用快捷键总结
- bfc是什么_全面分析总结BFC原理及实践
- 新手指导:51CTO微博小技巧
- 在VS2012中实现ExtJS的智能提示
- python居中对齐符号怎么打_Python字符串居中对齐
- 自动驾驶汽车寿命只有四年?
- Tidal Finance在Uniswap开启流动性挖矿
- 简练软考知识点整理-管理沟通
- 上网痕迹查询助手Viewurl 2017
- 嵌入式操作系统新纪元?
- 判断三点方向(顺时针或逆时针)
- 技术控 | 自然语言技术在文智趋势分析产品上的应用
- afx.h(24): fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requi
- 【转载】解决illustrator cs6提示错误16的方法
- 【最详细,最新】电脑网站接入支付宝接口
- 【附源码】计算机毕业设计java智慧停车系统设计与实现
- 华为设备配置策略路由引流到旁挂防火墙
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记15 storyboard中的绘图 MVC模式
热门文章
- R语言做Scheirer–Ray–Hare检验
- Android 使用百度鹰眼实现运动轨迹功能
- OPPO折叠屏,被期待的“颠覆者”
- Linux根目录下各文件都是存放什么的
- 【免费】win7 所有.net framework框架集合,免费下载,若要运行此应用程序,您必须首先安装net framework如何解决
- 关于考证(已通过高项、CISA、CISSP、HCIP、RHCE)
- [古典密码]:Vigenere cipher 维吉尼亚密码
- html pc端一般宽度多少钱,pc网页设计尺寸_pc端网页设计尺寸规范
- 攻防世界web新手题(小白做题)
- 2018腾讯实习招聘笔试编程题之翻转数列