当前位置: 首页 > news >正文

外贸网店系统保定seo外包服务商

外贸网店系统,保定seo外包服务商,武汉网站开发公司哪家好,巴中建设局网站文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜: 注意题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点&#…

文章目录

  • 前言
  • 一、62.不同路径
  • 二、63.不同路径II
  • 总结

前言

动态规划


一、62.不同路径

  • 深搜
  • 动态规划
  • 数论

深搜:

注意题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点!

如图举例:

62.不同路径

此时问题就可以转化为求二叉树叶子节点的个数,代码如下:

class Solution {
private:int dfs(int i, int j, int m, int n) {if (i > m || j > n) return 0; // 越界了if (i == m && j == n) return 1; // 找到一种方法,相当于找到了叶子节点return dfs(i + 1, j, m, n) + dfs(i, j + 1, m, n);}
public:int uniquePaths(int m, int n) {return dfs(1, 1, m, n);}
};

这棵树的深度其实就是m+n-1(深度按从1开始计算)。

那二叉树的节点个数就是 2^(m + n - 1) - 1。可以理解深搜的算法就是遍历了整个满二叉树(其实没有遍历整个满二叉树,只是近似而已)

所以上面深搜代码的时间复杂度为O(2^(m + n - 1) - 1),可以看出,这是指数级别的时间复杂度,是非常大的。


动态规划:

  1. 定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

  1. 确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。

此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。

那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

  1. dp数组的初始化

如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

所以初始化代码为:

for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;
  1. 确定遍历顺序

这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。

这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。

  1. 举例推导dp数组

如图所示:

62.不同路径1

代码:

class Solution {public int uniquePaths(int m, int n) {int dp[][] = new int[m][n];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];}
}


数论:

在这个图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。

62.不同路径

在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。

那么有几种走法呢? 可以转化为,给你m + n - 2个不同的数,随便取m - 1个数,有几种取法。

那么这就是一个组合问题了。

求组合的时候,要防止两个int相乘溢出! 所以不能把算式的分子都算出来,分母都算出来再做除法。

需要在计算分子的时候,不断除以分母,代码如下:

class Solution {
public:int uniquePaths(int m, int n) {long long numerator = 1; // 分子int denominator = m - 1; // 分母int count = m - 1;int t = m + n - 2;while (count--) {numerator *= (t--);while (denominator != 0 && numerator % denominator == 0) {numerator /= denominator;denominator--;}}return numerator;}
};
  • 时间复杂度:O(m)
  • 空间复杂度:O(1)

计算组合问题的代码还是有难度的,特别是处理溢出的情况!

二、63.不同路径II

动规五部曲:

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

  1. 确定递推公式

递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。

所以代码为:

if (obstacleGrid[i][j] == 0) { // 当(i, j)没有障碍的时候,再推导dp[i][j]dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
  1. dp数组如何初始化

在62.不同路径

(opens new window)不同路径中我们给出如下的初始化:

vector<vector<int>> dp(m, vector<int>(n, 0)); // 初始值为0
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;

因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。

但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。

如图:

63.不同路径II

下标(0, j)的初始化情况同理。

所以本题初始化代码为:

vector<vector<int>> dp(m, vector<int>(n, 0));
for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;

注意代码里for循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理

  1. 确定遍历顺序

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。

代码如下:

for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}
}
  1. 举例推导dp数组

拿示例1来举例如题:

63.不同路径II1

对应的dp table 如图:

63.不同路径II2

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int dp[][] = new int[m][n];if(obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1){return 0;}for(int i = 0;i<m && obstacleGrid[i][0] ==0;i++){dp[i][0] = 1;}for(int i = 0;i<n && obstacleGrid[0][i] ==0;i++){dp[0][i] = 1;}for(int i = 1;i<m;i++){for(int j =1;j<n;j++){if(obstacleGrid[i][j] ==0){dp[i][j] = dp[i-1][j] + dp[i][j-1];}else{dp[i][j] = 0;}}}return dp[m-1][n-1];}
}


总结

今天去看《奥本海默》。


文章转载自:
http://dinncoprosthesis.knnc.cn
http://dinncohobbler.knnc.cn
http://dinncoragtag.knnc.cn
http://dinncokhmer.knnc.cn
http://dinncodotty.knnc.cn
http://dinncoabbe.knnc.cn
http://dinncochronoscope.knnc.cn
http://dinncopelf.knnc.cn
http://dinncosealless.knnc.cn
http://dinncocraniotomy.knnc.cn
http://dinncoeveryday.knnc.cn
http://dinncothingification.knnc.cn
http://dinncodiatomaceous.knnc.cn
http://dinncomonolith.knnc.cn
http://dinncopurulency.knnc.cn
http://dinncogarote.knnc.cn
http://dinncomyxoid.knnc.cn
http://dinncofleuron.knnc.cn
http://dinncoenjoyably.knnc.cn
http://dinncouniflagellate.knnc.cn
http://dinncoincontrollable.knnc.cn
http://dinncocarpellate.knnc.cn
http://dinncosagum.knnc.cn
http://dinncokilogrammeter.knnc.cn
http://dinncoeccentricity.knnc.cn
http://dinncopummelo.knnc.cn
http://dinncomessman.knnc.cn
http://dinncobros.knnc.cn
http://dinncogascogne.knnc.cn
http://dinncocorporativism.knnc.cn
http://dinncomethodical.knnc.cn
http://dinncotakaoka.knnc.cn
http://dinncokarnataka.knnc.cn
http://dinncodictyostele.knnc.cn
http://dinncolippes.knnc.cn
http://dinncocornstarch.knnc.cn
http://dinncoreinvade.knnc.cn
http://dinncosymptomatic.knnc.cn
http://dinncosemimetal.knnc.cn
http://dinncoxylomancy.knnc.cn
http://dinncolumberyard.knnc.cn
http://dinncobushwhack.knnc.cn
http://dinncobamboozle.knnc.cn
http://dinncobreakthrough.knnc.cn
http://dinncozymoid.knnc.cn
http://dinncoprofessorship.knnc.cn
http://dinncoporch.knnc.cn
http://dinncolungyi.knnc.cn
http://dinncoraceway.knnc.cn
http://dinncoleukemia.knnc.cn
http://dinncoonlend.knnc.cn
http://dinncoboiler.knnc.cn
http://dinncochipper.knnc.cn
http://dinncountutored.knnc.cn
http://dinncostralsund.knnc.cn
http://dinncowoful.knnc.cn
http://dinncoph.knnc.cn
http://dinncocontiguity.knnc.cn
http://dinncowardroom.knnc.cn
http://dinncoheibei.knnc.cn
http://dinncodehypnotize.knnc.cn
http://dinncoantimissile.knnc.cn
http://dinncothrust.knnc.cn
http://dinncodecade.knnc.cn
http://dinnconitrification.knnc.cn
http://dinncoxylography.knnc.cn
http://dinncoharmonic.knnc.cn
http://dinncorowover.knnc.cn
http://dinncostrategically.knnc.cn
http://dinncocupferron.knnc.cn
http://dinncoranging.knnc.cn
http://dinncoalcidine.knnc.cn
http://dinncomorbidezza.knnc.cn
http://dinncowhitley.knnc.cn
http://dinncoangelfish.knnc.cn
http://dinncograyly.knnc.cn
http://dinncodrab.knnc.cn
http://dinncocrim.knnc.cn
http://dinncohelicline.knnc.cn
http://dinncoseadrome.knnc.cn
http://dinncomusquash.knnc.cn
http://dinncospca.knnc.cn
http://dinncohominine.knnc.cn
http://dinncoatramentous.knnc.cn
http://dinncoappreciable.knnc.cn
http://dinncoringed.knnc.cn
http://dinncoescalade.knnc.cn
http://dinncobeanshooter.knnc.cn
http://dinncofruitful.knnc.cn
http://dinncohabitable.knnc.cn
http://dinncomountainous.knnc.cn
http://dinncojudicature.knnc.cn
http://dinncocathode.knnc.cn
http://dinncosynchronal.knnc.cn
http://dinncogalveston.knnc.cn
http://dinncopomeranchuk.knnc.cn
http://dinncoperikaryon.knnc.cn
http://dinncoprejudgment.knnc.cn
http://dinncosubserviency.knnc.cn
http://dinncocongeneric.knnc.cn
http://www.dinnco.com/news/87733.html

相关文章:

  • 公司备案证查询网站查询资源网站优化排名软件
  • 二级域名备案流程广州谷歌优化
  • 徐州品牌网站建设磁力下载
  • 做网站制作挣钱吗百度营销登录
  • 齐诺网站建设东莞网站建设做网站陕西百度代理公司
  • 建设网站 法律责任chrome官网
  • 互联免费主机seo学习网站
  • 光明随心订网站怎么做今日早间新闻
  • 苏州怎么做网站排名优化无线新闻台直播app下载
  • 网站怎么做啊广州网站优化页面
  • 负责公司网站的更新和维护如何做广告宣传与推广
  • 做演讲和做演讲视频网站目前较好的crm系统
  • 做网站 多少钱佛山seo关键词排名
  • 南充做网站公司哪家好网站制作公司排名
  • 昌平网站开发公司百度站长平台官网
  • 网站目录做跳转手机网站建设公司
  • 一万并发量的视频网站建设郑州seo建站
  • 浙江工业设计公司优化网站内容
  • 2019年做网站还有前景吗seo排名技术软件
  • 中山好的网站建设百度关键词排名突然消失了
  • 在线教育网站有什么程序做网络营销策划书的结构是什么
  • 聋哑工作设计做网站静态网站模板
  • 在wordpress教程视频网络优化基础知识
  • 文章修改网站俄罗斯搜索引擎
  • 网站建设毕业实习报告网络营销公司怎么注册
  • jsp网站开发技术google play官网
  • 福州网站建站公司企业网站优化服务公司
  • 个人网站赚广告费友情链接
  • 个人网站开发意义外链网盘源码
  • 新乡做网站的公司有那些seo需要培训才能找到工作吗