【算法专题】动态规划之路径问题

动态规划2.0

  • 动态规划 - - - 路径问题
    • 1. 不同路径
    • 2. 不同路径Ⅱ
    • 3. 珠宝的最高价值
    • 4. 下降路径最小和
    • 5. 最小路径和
    • 6. 地下城游戏

动态规划 - - - 路径问题

1. 不同路径

题目链接 -> Leetcode -62.不同路径

Leetcode -62.不同路径

题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?

示例 1:
输入:m = 3, n = 7
输出:28

示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。

  1. 向右->向下->向下
  2. 向下->向下->向右
  3. 向下->向右->向下

示例 3:
输入:m = 7, n = 3
输出:28

示例 4:
输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10^9

思路:

  1. 状态表示:对于这种「路径类」的问题,我们的状态表示一般有两种形式:
    i. 从 [i, j] 位置出发,…;
    ii. 从起始位置出发,到达 [i, j] 位置,…;
    我们选择第二种定义状态表示的方式:dp[i][j] 表示:走到 [i, j] 位置处,一共有多少种方式。
  2. 状态转移方程:分析一下,如果 dp[i][j] 表示到达 [i, j] 位置的方法数,那么到达 [i, j] 位置之前的一小步,有两种情况:
    i. 从 [i, j] 位置的上方( [i - 1, j] 的位置)向下走一步,转移到 [i, j] 位置;
    ii. 从 [i, j] 位置的左方( [i, j - 1] 的位置)向右走一步,转移到 [i, j] 位置。
    由于我们要求的是有多少种方法,因此状态转移方程就呼之欲出了: dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 。
  3. 返回值:根据状态表示,我们要返回 dp[m][n] 的值。

代码如下:

		class Solution {public:int uniquePaths(int m, int n){// 多开一行一列,可以直接在循环内初始化vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[0][1] = 1;  // 为了后面填表的正确// dp[i][j] 表示:⾛到 [i, j] 位置处,⼀共有多少种方式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][n];}};

2. 不同路径Ⅱ

题目链接 -> Leetcode -63.不同路径Ⅱ

Leetcode -63.不同路径Ⅱ

题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。

示例 1:
输入:obstacleGrid = [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:

  1. 向右->向右->向下->向下
  2. 向下->向下->向右->向右

示例 2:
输入:obstacleGrid = [[0, 1], [0, 0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

思路:本题为不同路径的变型,只不过有些地方有「障碍物」,只要在「状态转移」上稍加修改就可解决。

  1. 状态表示:dp[i][j] 表示:走到 [i, j] 位置处,一共有多少种方式。
  2. 状态转移:简单分析一下。如果 dp[i][j] 表示到达 [i, j] 位置的方法数,那么到达 [i, j] 位置之前的一小步,有两种情况:
    i. 从 [i, j] 位置的上方( [i - 1, j] 的位置)向下走一步,转移到 [i, j] 位置;
    ii. 从 [i, j] 位置的左方( [i, j - 1] 的位置)向右走一步,转移到 [i, j] 位置。
    但是, [i - 1, j] 与 [i, j - 1] 位置都是可能有障碍的,此时从上面或者左边是不可能到达 [i, j] 位置的,也就是说,此时的方法数应该是 0;由此我们可以得出一个结论,只要这个位置上「有障碍物」,那么我们就不需要计算这个位置上的值,直接让它等于 0 即可。
  3. 返回值:根据状态表示,我们要返回的结果是 dp[m][n].

代码如下:

		class Solution {public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid){int m = obstacleGrid.size(), n = obstacleGrid[0].size();// 多开一行一列方便初始化vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[0][1] = 1; // 为了后面填表的正确// dp[i][j] 表示:⾛到 [i, j] 位置处,⼀共有多少种方式for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){// 原矩阵中的位置不是障碍物if (obstacleGrid[i - 1][j - 1] != 1){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m][n];}};

3. 珠宝的最高价值

题目链接 -> Leetcode -LCR 166.珠宝的最高价值

Leetcode -LCR 166.珠宝的最高价值

题目:现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:

只能从架子的左上角开始拿珠宝
每次可以移动到右侧或下侧的相邻位置
到达珠宝架子的右下角时,停止拿取
注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如 frame = [[0]] 。

示例 1:
输入: frame = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
输出 : 12
解释 : 路径 1→3→5→2→1 可以拿到最高价值的珠宝

提示:

  • 0 < frame.length <= 200
  • 0 < frame[0].length <= 200

思路:本题的思路与上题的思路差不多,状态转移方程为:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j] .

代码如下:

		class Solution {public:int maxValue(vector<vector<int>>& grid){int m = grid.size(), n = grid[0].size();// 多开一行一列方便初始化vector<vector<int>> dp(m + 1, vector<int>(n + 1));// dp[i][j] 表示:⾛到 [i, j] 位置处,此时的最大价值for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];}}return dp[m][n];}};

4. 下降路径最小和

题目链接 -> Leetcode -931.下降路径最小和

Leetcode -931.下降路径最小和

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

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

示例 1:
输入:matrix = [[2, 1, 3], [6, 5, 4], [7, 8, 9]]
输出:13
解释:如图所示,为和最小的两条下降路径
在这里插入图片描述

示例 2:
输入:matrix = [[-19, 57], [-40, -5]]
输出: - 59
解释:如图所示,为和最小的下降路径

在这里插入图片描述

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • 100 <= matrix[i][j] <= 100

思路:

  1. 状态表示:dp[i][j] 表示:到达 [i, j] 位置时,所有下降路径中的最小和。
  2. 状态转移方程:对于普遍位置 [i, j] ,根据题意得,到达 [i, j] 位置可能有三种情况:
    i. 从正上方 [i - 1, j] 位置转移到 [i, j] 位置;
    ii. 从左上方 [i - 1, j - 1] 位置转移到 [i, j] 位置;
    iii. 从右上方 [i - 1, j + 1] 位置转移到 [i, j] 位置;
    我们要的是三种情况下的「最小值」,然后再加上矩阵在 [i, j] 位置的值。
    于是 dp[i][j] = min(dp[i - 1][j], min(dp[i - 1][j - 1], dp[i - 1][j + 1])) + matrix[i][j] 。
  3. 返回值:注意这里不是返回 dp[m][n] 的值;题目要求「只要到达最后一行」就行了,因此这里应该返回「 dp 表中最后一行的最小值」。

代码如下:

		class Solution {public:int minFallingPathSum(vector<vector<int>>& matrix){int len = matrix.size();// 多开一行,两列,因为dp[i][j]的值需要用到dp[i - 1][j], dp[i - 1][j - 1], dp[i - 1][j + 1]vector<vector<int>> dp(len + 1, vector<int>(len + 2, INT_MAX));// 初始化,为了后面填表的正确性for (int i = 0; i <= len; i++) dp[0][i] = 0;// dp[i][j] 表示:到达 [i, j] 位置时,所有下降路径中的最小和for (int i = 1; i <= len; i++){for (int j = 1; j <= len; 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];}}// 返回最后一行的最小值int ret = INT_MAX;for (int j = 0; j <= len; j++) ret = min(ret, dp[len][j]);return ret;}};

5. 最小路径和

题目链接 -> Leetcode -64.最小路径和

Leetcode -64.最小路径和

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

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

示例 1:
输入:grid = [[1, 3, 1], [1, 5, 1], [4, 2, 1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
在这里插入图片描述

示例 2:
输入:grid = [[1, 2, 3], [4, 5, 6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

思路:

  1. 状态表示:dp[i][j] 表示:到达 [i, j] 位置处,最小路径和是多少
  2. 状态转移:分析一下,如果 dp[i][j] 表示到达 [i, j] 位置处的最小路径和,那么到达[i, j] 位置之前的一小步,有两种情况:
    i. 从 [i - 1, j] 向下走一步,转移到 [i, j] 位置;
    ii. 从 [i, j - 1] 向右走一步,转移到 [i, j] 位置。
    由于到 [i, j] 位置两种情况,并且我们要找的是最小路径,因此只需要这两种情况下的最小值,再加上 [i, j] 位置上本身的值即可。也就是: dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
  3. 返回值:根据状态表示,我们要返回的结果是 dp[m][n].

代码如下:

		class Solution {public:int minPathSum(vector<vector<int>>& grid){int m = grid.size(), n = grid[0].size();// dp[i][j] 表示:到达 [i, j] 位置处,最小路径和是多少vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));dp[0][1] = 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];}};

6. 地下城游戏

题目链接 -> Leetcode -174.地下城游戏

Leetcode -174.地下城游戏

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

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

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);
其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。
为了尽快解救公主,骑士决定每次只 向右 或 向下 移动一步。
返回确保骑士能够拯救到公主所需的最低初始健康点数。
注意:任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。

示例 1:
输入:dungeon = [[-2, -3, 3], [-5, -10, 1], [10, 30, -5]]
输出:7
解释:如果骑士遵循最佳路径:右->右->下->下 ,则骑士的初始健康点数至少为 7 。

示例 2:
输入:dungeon = [[0]]
输出:1

提示:

  • m == dungeon.length
  • n == dungeon[i].length
  • 1 <= m, n <= 200
  • 1000 <= dungeon[i][j] <= 1000

思路:

  1. 状态表示:这道题如果我们定义成:从起点开始,到达 [i, j] 位置的时候,所需的最低初始健康点数。那么我们分析状态转移的时候会有一个问题:那就是我们当前的健康点数还会受到后面的路径的影响。也就是从上往下的状态转移不能很好地解决问题。
    这个时候我们要换一种状态表示:从 [i, j] 位置出发,到达终点时所需要的最低初始健康点数。这样我们在分析状态转移的时候,后续的最佳状态就已经知晓。综上所述,定义状态表示为:dp[i][j] 表示:从 [i, j] 位置出发,到达终点时所需的最低初始健康点数。
  2. 状态转移方程:对于 dp[i][j] ,从 [i, j] 位置出发,下一步会有两种选择(为了方便理解,设 dp[i][j] 的最终答案是 x ):
    i. 走到右边,然后走向终点;那么我们在 [i, j] 位置的最低健康点数加上这一个位置的消耗,应该要大于等于右边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i][j + 1] ;通过移项可得: x >= dp[i][j + 1] - dungeon[i][j] 。因为我们要的是最小
    值,因此这种情况下的 x = dp[i][j + 1] - dungeon[i][j] ;
    ii. 走到下边,然后走向终点;那么我们在 [i, j] 位置的最低健康点数加上这⼀个位置的消耗,应该要大于等于下边位置的最低健康点数,也就是: x + dungeon[i][j] >= dp[i + 1][j] 。通过移项可得: x >= dp[i + 1][j] - dungeon[i][j] 。因为我们要的是最小值,因此这种情况下的 x = dp[i + 1][j] - dungeon[i][j] ;
  • 综上所述,我们需要的是两种情况下的最小值,因此可得状态转移方程为:dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j]

但是,如果当前位置的 dungeon[i][j] 是一个比较大的正数的话, dp[i][j] 的值可能变成 0 或者负数。也就是最低点数会小于 1 ,那么骑士就会死亡。因此我们求出来的 dp[i][j] 如果小于等于 0 的话,说明此时的最低初始值应该为 1 。处理这种情况仅需让 dp[i][j] 与 1 取一个最大值即可:dp[i][j] = max(1, dp[i][j])

  1. 初始化:可以在最前面加上一个「辅助结点」,帮助我们初始化。使用这种技巧要注意两个点:
    i. 辅助结点里面的值要「保证后续填表是正确的」;
    ii. 「下标的映射关系」。
    在本题中,在 dp 表最后面添加一行,并且添加一列后,所有的值都先初始化为无穷大,然后让 dp[m][n - 1] = dp[m - 1][n] = 1 即可。

  2. 返回值:根据「状态表示」,我们需要返回 dp[0][0] 的值。

代码如下:

		class Solution {public:int calculateMinimumHP(vector<vector<int>>& dungeon){int m = dungeon.size(), n = dungeon[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));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];// 如果减到负数,说明这里的血包很大,即使是负数到这里都可以,但是这是不符合常理的// 所以需要将这里置成 1 即可if (dp[i][j] <= 0) dp[i][j] = 1;    }}// 返回最初位置return dp[0][0];}};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论 Solon 开源框架的意义!

Solon 是一个国产的生态级 Java 应用开发框架&#xff08;已发具备全球第二级别的生态&#xff09;。七年时间打磨。14 万行代码。两三百个生态扩展呢。 国内第一个 从零开始构建&#xff0c;有自己的标准规范与开放生态。尤其没有使用 javaee 的接口规范&#xff08;它改包名…

srs5.0.205编译启动

官方有教程了&#xff0c;但是我编译的时候出了很多错误&#xff0c;记录一下。 官方文档&#xff1a;https://ossrs.net/lts/zh-cn/docs/v4/doc/getting-started-build 拉取源码 git clone -b 4.0release https://gitee.com/ossrs/srs.git进入文件夹 cd srs/trunk配置 ./c…

【apollo在springboot中运行原理】

系列文章目录 Springboot源码分析之apollo配置 文章目录 系列文章目录前言一、apollo是如何完成初始化的,拉取配置的呢1. apollo的初始化阶段2.初始化RemoteConfigRepository3.同步远程配置4.发布ConfigFileChangeEvent事件 总结 前言 配置中心我相信有一年开发经验的程序员都…

【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…

【win】Windows下MSI Afterburner如何让其不在某个软件中显示帧数

本文首发于 慕雪的寒舍 Windows下MSI Afterburner如何让其不在某个软件中显示帧数 1.问题说明 总所周知&#xff0c;MSI Afterburner这个软件可以在游戏里面展示你当前电脑的各项生命体征&#xff0c;包括GPU/CPU功耗频率温度&#xff0c;内存占用&#xff0c;当前帧数等等数据…

java重写与重载的区别详细讲解通俗易懂

重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;是Java中的两个重要概念&#xff0c;它们都涉及到方法的使用和定义。下面我会通俗易懂地解释它们的区别。 重写&#xff08;Override&#xff09;指的是在子类中重新定义父类中已经存在的方法&…

OpenKruiseGame × KubeSphere 联合发布游戏服运维控制台,推动云原生游戏落地

作者&#xff1a;云原生游戏社区 近日&#xff0c;云原生游戏开源社区旗下 OpenKruiseGame&#xff08;以下简称&#xff1a;OKG&#xff09;基于 KubeSphere 4.0 LuBan 架构开发的游戏服运维控制台 OKG Dashboard 正式发布&#xff01;现已上架 KubeSphere Marketplace 云原生…

32、WEB攻防——通用漏洞文件上传二次渲染.htaccess变异免杀

文章目录 一、点过滤二、文件删除三、二次渲染四、.htaccess五、过滤php关键函数 一、点过滤 不能写带文件后缀的文件名&#xff1b;IP转数字 二、文件删除 文件依据规则进行删除&#xff0c;删除有两种删除的类型&#xff1a; 什么文件都删除&#xff0c;条件竞争进行绕过…

宠物热潮席卷欧美:探秘宠物经济的蓬勃发展与增长动力

近年来&#xff0c;宠物经济在欧美地区蓬勃发展&#xff0c;成为经济体系中一股不可忽视的力量。从宠物食品到医疗护理&#xff0c;从宠物用品到服务业&#xff0c;整个产业链日益完善&#xff0c;呈现出多元化、高度专业化的趋势&#xff0c;不仅满足了宠物主人的需求&#xf…

Node.JS CreateWriteStream(大容量写入文件流优化)

Why I Need Node.JS Stream 如果你的程序收到以下错误&#xff0c;或者需要大容量写入很多内容(几十几百MB甚至GB级别)&#xff0c;则必须使用Stream文件流甚至更高级的技术。 Error: EMFILE, too many open files 业务场景&#xff0c;我们有一个IntradayMissingRecord的补…

LeetCode2865. Beautiful Towers I

文章目录 一、题目二、题解 一、题目 You are given a 0-indexed array maxHeights of n integers. You are tasked with building n towers in the coordinate line. The ith tower is built at coordinate i and has a height of heights[i]. A configuration of towers i…

TDengine 十大行业案例汇总,总有一款适合你!

伴随着产品的六载创新与发展&#xff0c;TDengine 的全球用户实例以日增 500 例在持续扩大。截至 2024 年初&#xff0c;TDengine 全球运行的实例数已经超过了 46 万&#xff0c;在物联网、车联网、工业互联网等多个领域都有了广泛的应用&#xff0c;越来越多的企业和组织选择使…

Java数据结构与算法:图算法之深度优先搜索(DFS)

Java数据结构与算法&#xff1a;图算法之深度优先搜索&#xff08;DFS&#xff09; 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;一个热爱编程的程序猿。今天&#xff0c;让我们一起探索图算法中的深度优先搜索&#xff08;DFS&…

《WebKit 技术内幕》学习之十二(1):安全机制

第12章 安全机制 安全机制对于浏览器和渲染引擎来说至关重要。一个不考虑安全机制的HTML5规范体系肯定不会受到广泛地使用&#xff0c;同时一个不安全的浏览器也不会得到广大用户的青睐。本章介绍的安全机制分成两个不同的部分&#xff0c;第一个部分是网页的安全&#xff0c;…

详解Mockito

详解Mockito 1. Mockito简介 在我们的编程世界中&#xff0c;测试是一个非常重要的环节&#xff0c;它能帮助我们确保代码的质量和稳定性。而在众多的测试方法中&#xff0c;Mock测试是一种非常有效的手段。 1.1 什么是 Mock 测试 Mock测试&#xff0c;顾名思义&#xff0c;…

gtest 单元测试

文章目录 前言一、Google Test介绍1.1 gtest源码下载编译1.2 gtest运行参数介绍 二、Google Mock参考资料 前言 Google Test&#xff08;简称gtest&#xff09;是一个开源的C单元测试框架。和常见的测试工具一样&#xff0c;gtest提供了单体测试常见的工具和组件。比如判断各种…

邦芒支招:10种小妙招让你准时下班

工作的人都希望能准时下班&#xff0c;都不希望加班&#xff0c;那么怎么做才能准时下班呢来看看下面这10种方法吧 1、提前整理文件 错误示范&#xff1a;一下班就冲出办公室&#xff0c;什么都不管。第二天怎么都找不到记着重要电话号码的便利贴了。 正确示范&#xff1a;离…

Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

产品面试题2

39.产品经理在与 开发团队合作时&#xff0c;以下哪个角色负责将产品需求转化为可执行的任务&#xff1f; a) 技术经理 b) 交互设计师 c) 项目经理 d) 开发工程师 答案&#xff1a;c 40.以下哪个方法适用于评估产品的用户满意度和体验&#xff1f; a) 用户访谈 b) 用户调研问卷…

Win10设置有线网络和WiFi网络优先级-240124成功

Win10怎么设置有线网络和WiFi网络优先级? 修改“接口跃点数”方法成功。 使用ip.sb进行检验ip是否设置成功。