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

2023网络舆情案例分析公司搜索seo

2023网络舆情案例分析,公司搜索seo,天津业之峰装饰公司官网,b2b平台推广哪家好目录 1.下降路径最小和 题解 2.最小路径和 题解 3.地下城游戏 题解 做算法题的时候,谨记图画得越详细越好,思路想的越清晰越好,然后再用代码实现一下就好啦 1.下降路径最小和 链接:931. 下降路径最小和 给你一个 n x n 的…

目录

1.下降路径最小和

题解

2.最小路径和

题解

3.地下城游戏

题解


做算法题的时候,谨记图画得越详细越好,思路想的越清晰越好,然后再用代码实现一下就好啦

1.下降路径最小和

链接:931. 下降路径最小和

给你一个 n x n 方形 整数数组 matrix ,请你找出并返回通过 matrix下降路径 最小和

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)(row + 1, col) 或者 (row + 1, col + 1)


题解

  • 给一个nxn矩阵,让返回从第一行下降到最后一行的最小和
  • 如果当前位置是(row, col) 的下一个元素应当是

(row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 中选一个。

1.状态表示

  • 经验 + 题目要求
  • dp[i][j] 表示:到达 [i][j] 位置时,最小的下降路径

2.状态转移方程

  • 根据最近一步,划分问题
  • 到达[i][j] 位置有三种情况,从[i-1][j-1],[i-1][j],[i-1][j+1]任意一个位置都可以到。
  • 但是我们要找的是到达 [i][j] 最小路径,那 [i-1][j-1],[i-1][j],[i-1][j+1]一定要是最小。

dp[i][j] 表示:到达 [i][j] 位置时,最小的下降路径。然后在加上[i][j]本身的值。所以状态转移方程为

  • dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+m[i][j]
  • 保证最小,就保证之前的每一步都是最小的,然后再加上这一步就好啦
  • 就像我们做事一样,做好当下就好了,这样之后也一定会是好的~

3.初始化

如果我们开辟和原数组一样大小的dp表,第一行和第一列和最后一列填表的时候都会越界。

因此dp表可以多开一行多开两列。

  • 虚拟节点里面的值,要保证后面填表的结果是正确的
  • 下标的映射

虚拟节点的值应该放什么呢。

  • 先不考虑多加的行和列。
  • 没有这些的话,考虑这些填表越界的格子应该填多少。
  • 先看第一行,从第一行开始到达第一行当前位置最小下降路径和,此时是没有选择的,只能是自己本身的值。

正好代入状态转移方程是没问题的,因此第一行虚拟节点的值应该填0。

  • 再看第一列和最后一列,如果第一列和最后一轮还是0的话,可不可以?
  • 如果第一列和最后一列是0的话,我们要的是三者中的最小值
  • 在填表的时候就影响到上面经过计算得到的正确结果,因此第一行和第一列不能是0,我们可以给一个+∞。
  • 因为dp表多加一行两列整是往右下移动一位的。

填表的时候要从dp表找到原始矩阵的值,必须i-1,j-1

4.填表顺序

  • 从上到下填写每一行,每一行从左往右

5.返回值

  • 找到最后一行的最小值
class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int m=matrix.size(),n=matrix[0].size();//多两列哦vector<vector<int>> dp(m+1,vector<int>(n+2,0));//因为每行是要选择最小值,所以两列要初始化为无穷大for(int i=1;i<=m;i++){dp[i][0]=dp[i][n+1]=INT_MAX;}//填表for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){
dp[i][j]=min(min(dp[i-1][j],dp[i-1][j-1]),dp[i-1][j+1])
+matrix[i-1][j-1]; //不可以三个min//注意 下表映射//遍历 处理 上一行的-->推出这一行的}}int ret=INT_MAX;for(int j=1;j<=n;j++){ret=min(ret,dp[m][j]);}return ret;}
};

2.最小路径和

链接:64. 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。


题解

  • 求左上角到右上角最小路径和。
  • 注意只能向下向右移动!

1.状态表示

  • 经验 + 题目要求
  • dp[i][j] 表示:到达 [i][j] 位置时,最小路径和

2.状态转移方程

  • 据最近一步,划分问题

到达[i][j]有两种情况,[i-1][j],[i][j-1]都可以到,但是我们要找的是到达 [i][j] 最小路径

  • [i-1][j],[i][j-1]一定要是最小。
  • 而dp[i][j] 表示:到达 [i][j] 位置时,最小的下降路径。

然后在加上[i][j]本身的值。所以状态转移方程为

  • dp[i][j]=min(dp[i-1][j],dp[i][j-1])+g[i][j]

3.初始化

  • 填表时保证不越界

如果我们开辟和原数组一样大小的dp表,第一行和第一列填表的时候都会越界。

因此dp表可以多开一行一列

  • 虚拟节点里面的值,要保证后面填表的结果是正确的
  • 下标的映射

虚拟节点的值应该放什么呢。

  • 先不考虑多加的行和列。没有这些的话,考虑这些填表越界的格子应该填多少。
  • 先看第一个格子,第一个格子的意思是dp[0][0]表示达到[0][0]位置的最小值,那没得选就是它本身也就是之前矩阵g[0][0]的值
  • 这个格子的值是上一个格子和左边格子的最小值在加上自己本身

因此第一个格子上面和左边虚拟格子我们给0

剩下的虚拟格子也给0吗

  • 不行的。如果是0,那这个虚拟格子里的值就会参与取最小值的运算
  • 会导致填表错误。因此把剩下格子设置为+∞,只把[0][1]和[1][0]位置设置为0就好了。

当前你也可以直接把第一行和第一列初始化,但是用的更多的还是多开一行一列。

如果做的多,你会发现求最小值,就是dp表先给+∞,仅修改几个位置的值就可以了

同样求最大值,dp表先给-∞,然后修改几个位置的值就可以了。

4.填表顺序

  • 从上到下填写每一行,每一行从左往右

5.返回值

  • 多开一行一列右下角就变成[m][n],所以返回dp[m][n]
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int m=grid.size(),n=grid[0].size();
//minvector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));dp[0][1]=dp[1][0]=0;//保证第一个格子起始位置的合理性for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];//注意下标的映射}}return dp[m][n]; }
};

3.地下城游戏

链接: 174. 地下城游戏

恶魔们抓住了公主并将她关在了地下城 dungeon右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快解救公主,骑士决定每次只 向右向下 移动一步。

返回确保骑士能够拯救到公主所需的最低初始健康点数。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。


题解

骑士要从左上角出发到右下角救公主。

  • 骑士的初始健康点数为一个正整数。
  • 如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。
  • 骑士每次只能向左向右移动。骑士每到一个格子要么就是减去健康点、要么加上健康点、要么不增不加。

注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数

  • 包括骑士进入的左上角房间,以及公主被监禁的右下角房间。(虚拟化)
  • 也就是说到达右下角救公主也可能减去健康点。
  • 如下面例子,第一个格子是-2,我们可以给个3 ,但是走到-3,骑士就死了。
  • 我们也就知道给3不行,然后就给个6,走到右下角骑士也死了也是不行的。

因此最终给个7才真正救出公主。

  • 可以抽象理解为,我就是要走一个得结果为一个最小负数的路径,这样求得是他至少需要的健康点数

1.状态表示

  • 经验 + 题目要求

经验我们有两个,1.以某个位置为结尾,巴拉巴拉。 2.以某个位置为起点,巴拉巴拉。

  • 以某个位置为结尾,巴拉巴拉
  • dp[i][j] 表示:从起点出发,到达[i][j]位置的时候,所需要的最低初始健康点数。

但是回到刚才的分析,当往下走的时候,发现骑士死了,才知道初始给的健康点数是不对。

还需要重新给。

  • 显然是不行的。因此以某个位置为结尾这种经验定状态标识是不行的,所以换一种。
  • 以某个位置为起点,巴拉巴拉
  • dp[i][j] 表示从[i][j] 为起点,到达终点,所需最低初始健康值

2.状态转移方程

  • 还是根据最近的一步,划分问题

以[i][j]位置起点,下一步可以向下向右走。那走到下一步的时候是不是还要保证下一步还可以往下在走啊。

  • 假设健康值是x ,然后往右走
  • 是不是要保证 x + d[i][j] >= dp[i][j+1] ----> x >= dp[i][j+1] - d[i][j]
  • 又因为所需的是最低初始健康值,因此往右走仅需 x = dp[i][j+1] - d[i][j],同理往下走 x = dp[i+1][j] - d[i][j]

又因为所需最低初始健康值所以取它们中最小值。

  • 其实这里还可以这样理解,dp[i][j]表示 从[i][j]位置出发,到达终点,所需最低初始健康值。
  • 每次只能向右向下走,[i][j]最近一步 [i][j+1] 和 [i+1][j],那如果知道 dp[i][j+1]和dp[i+1][j] 到达终点,所需最低初始健康值,取它俩中最小,在减去 d[i][j] 到达终点所需最低初始健康值了吗。
  • dp[i][j] =min(dp[i][j+1],dp[i+1][j]) -d[i][j]

但是这里还有一个非常细的细节,如果dp[i][j] 等于一个负数怎么办。

  • 也就是说d[i][j] 这里是一个很大的血包,dp[i][j] 为负值 难道要一个死去的骑士要去救公主吗
  • 显示是不合常识的,因此要处理一下。
  • 这个血包就足以骑士走接下来的路,因此给骑士一个最低的健康点 1 就行了。
  • dp[i][j]=max(1,dp[i][j]);
  • 确保 骑士的血量 不可为负数

3.初始化

多给一行一列

  • 不过多给一行一列是给在下面的。
  • 所以 下表映射 没有改变~

只关注,虚拟节点的值,要保证接下来填表正确。

  • 骑士走到右下角救到公主之后,向右向下走还必须保证骑士活着健康点还必须是最低,因此dp[m][n-1] = dp[m-1][n] = 1
  • 其他虚拟节点的值为了不影响dp[i][j]找 min,直接给+∞。

4.填表顺序

  • 从 右下角 往 左上角

5.返回值

  • dp[0][0]
class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {//从 i,j 出发,到m,n的最小生命值int m=dungeon.size(),n=dungeon[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));//min dp[m-1][n]=dp[m][n-1]=1;//要能 活着救公主for(int i=m-1;i>=0;i--){for(int j=n-1;j>=0;j--){dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];  //-去 扣血,就是生命值dp[i][j]=max(1,dp[i][j]);//不为负哦}}return dp[0][0];//从 0,0 出发~}
};
http://www.dtcms.com/wzjs/258186.html

相关文章:

  • 在哪里可以学做饰品网站百度文库首页
  • 建设企业网站官网u盾登录宁波seo怎么做推广渠道
  • 房产网站建设接单企业网络推广的方式有哪些
  • 做任务得得q币的网站百度软件开放平台
  • 网站内页301重定向怎么做微信营销方法
  • 山东营销网站建设设计长沙谷歌seo
  • 百度做网站和推广效果怎么样云和数据培训机构怎么样
  • 宁波网站开发制作搜索引擎排名国内
  • 武汉最好的网站建设公司哪家好手机网络优化软件
  • 快乐建站网懂得网站推广
  • 网站ssl证书怎么做seo快速排名首页
  • 纺织品东莞网站建设免费引流推广的方法
  • 如何快速开发手机app麒麟seo
  • 互联网网站制作公司学seo推广
  • 营销型网站建设需要备案吗长尾关键词查询
  • 企业网站多少钱百度指数对比
  • 网站建设一定要域名吗营销策划公司靠谱吗
  • h5免费制作平台八图seo怎么去优化
  • 用http做网站隐藏端口最强大的搜索引擎
  • 广州小程序开发公司哪家好聊城seo整站优化报价
  • 网站备案代码谷歌seo课程
  • 南联做网站seo 排名 优化
  • 如何做网站内部优化企业网络
  • 网站空间申请开通日照seo公司
  • 网站电子商务平台建设域名注册商有哪些
  • 专业手机网站建设公司深圳知名网络优化公司
  • 南宁微信公众号开发深圳seo推广
  • 医院响应式网站建设方案个人网站制作模板
  • 短链接生成器手机版网站优化网站优化
  • 怎么在日本做乐天网站供货商外汇seo公司