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

哪个网站适合 做红本抵押设计网站一般多少钱

哪个网站适合 做红本抵押,设计网站一般多少钱,武汉营业执照代办的正规机构,做网站 设备64. 最小路径和 - 力扣(LeetCode) 和这一题特别像:LeetCode第 120 题:三角形最小路径和(C)_qq_32523711的博客-CSDN博客) 动态规划典型题目,状态方程如下 非边界,当i、j 均不为0时&#xff1…

64. 最小路径和 - 力扣(LeetCode)

和这一题特别像:LeetCode第 120 题:三角形最小路径和(C++)_qq_32523711的博客-CSDN博客)

动态规划典型题目,状态方程如下

非边界,当i、j 均不为0时:

f[i][j]=min(f[i][j−1],f[i−1][j])+grid[i][j]f[i][j] = min(f[i][j-1], f[i-1][j]) + grid[i][j]f[i][j]=min(f[i][j1],f[i1][j])+grid[i][j]

f[0][0]=grid[0][0]f[0][0] = grid[0][0]f[0][0]=grid[0][0]

边界时(左边界j=0,上边界i=0)

f[i][0]=f[i−1][0]+grid[i][0]f[i][0] = f[i-1][0] + grid[i][0]f[i][0]=f[i1][0]+grid[i][0]

f[0][i]=f[0][i−1]+grid[0][i]f[0][i] = f[0][i - 1] + grid[0][i]f[0][i]=f[0][i1]+grid[0][i]

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int col = grid[0].size();vector<vector<int>> f(row, vector<int>(col, 0));f[0][0] = grid[0][0];for (int i = 1; i < row; ++i) //左边界f[i][0] = f[i - 1][0] + grid[i][0];for (int i = 1; i < col; ++i) //上边界f[0][i] = f[0][i - 1] + grid[0][i];for (int i = 1; i < row; ++i){ //其他for (int j = 1; j < col; ++j)f[i][j] = min(f[i][j - 1], f[i - 1][j]) + grid[i][j];}return f[row - 1][col - 1];}
};

换个写法,思路更加清晰:

第一次循环,根据第一行的左边界f[0][0](已知)计算出第一行的剩余元素;

剩下的每一次循环之前,先计算当前行的左边界元素,然后根据左边界元素和上一行元素,计算出当前行的剩余元素。

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int col = grid[0].size();vector<vector<int>> f(row, vector<int>(col, 0));f[0][0] = grid[0][0];for (int i = 0; i < row; ++i){//先考虑行if(i != 0) f[i][0] = f[i-1][0] + grid[i][0];  //计算当前行的左边界元素for (int j = 1; j < col; ++j){if(i == 0) //如果是上边界(第一行)f[0][j] = f[0][j - 1] + grid[i][j];elsef[i][j] = min(f[i][j - 1], f[i - 1][j]) + grid[i][j];}}return f[row - 1][col - 1];}
};

可以看到空间复杂度为O(m*n),为辅助数组的占用空间。

下面进行一下优化吧,由状态方程可以看到,每一行的元素值只与该行元素和上一行元素有关,所以其实不需要n x m的额外空间(和这个类似:LeetCode第 120 题:三角形最小路径和(C++)_qq_32523711的博客-CSDN博客)。

一般这种情况我们可以使用滚动数组减少空间消耗,两行(2xn)交替使用就可以,更甚,其实一行(1xn)就可以

直接考虑一行(1xn),代码:

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int col = grid[0].size();vector<int> f(col, 0);for (int i = 0; i < row; ++i){f[0] = f[0] + grid[i][0]; //左边界f[0](第一列)for (int j = 1; j < col; ++j){if(i == 0) //如果是上边界(第一行)f[j] = f[j-1] + grid[i][j];elsef[j] = min(f[j - 1], f[j]) + grid[i][j];} }return f[col - 1];}
};

滚动数组(2xn)的也写一下:

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int row = grid.size();int col = grid[0].size();vector<vector<int>> f(2, vector<int>(col, 0));f[0][0] = grid[0][0];int cur; //滚动数组下标int pre; //滚动数组下标for (int i = 0; i < row; ++i){//先考虑行cur = i % 2; //要么1要么0)pre = 1-cur; //要么0要么1if(i != 0) f[cur][0] = f[pre][0] + grid[i][0];  //计算当前行的左边界元素for (int j = 1; j < col; ++j){if(i == 0) //如果是上边界(第一行)f[cur][j] = f[cur][j - 1] + grid[i][j];elsef[cur][j] = min(f[cur][j - 1], f[pre][j]) + grid[i][j];}}return f[cur][col - 1];}
};

更奇葩的也还有,空间复杂度O(1),直接在原数组上修改就行(因为每个数只会用到一次),思路和第一段代码一样,只是存储的时候稍作修改即可。。。不过,个人不是很推荐,修改原数组毕竟不太好。。吧。。。

这个题使用回溯的思路也是可以的,而且剪枝也简单(路径和大于当前最小路径和就直接cut掉)

http://www.lbrq.cn/news/2380123.html

相关文章:

  • 东莞常平做网站精准客户资源购买
  • 做网页要去哪个网站seo推广网络
  • 企业网站怎么做外贸网站外链平台
  • wordpress调用某指定分类栏目长沙靠谱seo优化
  • 网站建设去哪百度竞价开户费用
  • 网站做超链接的方式有哪些网站设计与实现毕业设计
  • 如何做网站百度排名优化什么是网络软文营销
  • 如何做一个与博物馆相关网站seo网络优化专员是什么意思
  • 2015选择做导航网站乔拓云网站建设
  • 中国企业网官方网站查询数字化营销
  • 上海网站搭建平台公司河南关键词优化搜索
  • 工商营业执照网上年审入口电脑优化系统的软件哪个好
  • 成都好玩的地方百度seo插件
  • 用什么工具做网站百度广告代理
  • 汉阳网站建设湖南靠谱seo优化报价
  • 保山手机网站建设关键词优化好
  • 阿里巴巴的电子商务网站建设网推团队
  • 莆田百度推广开户免费关键词优化工具
  • 开锁公司网站模板怎样把个人介绍放到百度
  • 建设一个网站需要多少钱百度移动应用
  • 做影视网站须要注意什么seo网站推广目的
  • 南通做网站的公司超云seo优化
  • 商城网站开发视频数据分析师资格证书怎么考
  • 网站建设免费的推广普通话宣传周
  • 悦然网络工作室广州百度快速优化排名
  • 中华人民共和国商务部网站市场建设司安徽网站推广
  • 做360手机网站优搭建网站需要哪些步骤
  • 怎么制作网站游戏优化关键词排名的工具
  • 商丘市建立网站公司电商培训机构有哪些?哪家比较好
  • dw做网站的实用特效网址收录查询
  • CCF编程能力等级认证GESP—C++3级—20250628
  • 有好内容,如何做好知识变现?
  • Linux 进程间通信
  • 【FFmpeg 快速入门】本地播放器 项目
  • CrewAI与LangGraph:下一代智能体编排平台深度测评
  • 2020717零碎写写