
2025-12-14:交替方向的最小路径代价Ⅱ。用go语言,给你一个 m 行 n 列的网格。进入格子 (i, j) 的花费为 (i+1)*(j+1)。另外每个格子还有一个等待代价矩阵 waitCost,waitCost[i][j] 表示在该格子停留 1 秒钟需要支付的费用。
路径从时间步 1 开始:第一步进入起点 (0,0),并支付该格子的进入费用。之后时间按秒递增,并且动作必须交替进行:
目标是以最小的总费用到达终点 (m-1, n-1)。请计算并返回这个最小总成本。
1 <= m, n <= 100000。
2 <= m * n <= 100000。
waitCost.length == m。
waitCost[0].length == n。
0 <= waitCost[i][j] <= 100000。
输入:m = 2, n = 3, waitCost = [[6,1,4],[3,2,5]]。
输出:16。
解释:
最佳路径为:
从第 1 秒开始在单元格 (0, 0),进入成本为 (0 + 1) * (0 + 1) = 1。
第 1 秒:向右移动到单元格 (0, 1),进入成本为 (0 + 1) * (1 + 1) = 2。
第 2 秒:在单元格 (0, 1) 等待,支付 waitCost[0][1] = 1。
第 3 秒:向下移动到单元格 (1, 1),进入成本为 (1 + 1) * (1 + 1) = 4。
第 4 秒:在单元格 (1, 1) 等待,支付 waitCost[1][1] = 2。
第 5 秒:向右移动到单元格 (1, 2),进入成本为 (1 + 1) * (2 + 1) = 6。
因此,总成本为 1 + 2 + 1 + 4 + 2 + 6 = 16。
题目来自力扣3603。
(0+1)*(0+1) = 1。这覆盖了输入waitCost矩阵中在(0,0)处的原始值(原为6)。waitCost[0][j]的初始值)加上左侧单元格(0,j-1)的累积代价,再加上当前单元格的进入代价j+1(因为i=0,进入代价为1*(j+1)=j+1)。f[0][1] = f[0][1] + f[0][0] + 1 + 1(初始f[0][1]为1,f[0][0]为1,结果为1+1+1+1=4)。waitCost[i][0]的初始值)加上上方单元格(i-1,0)的累积代价,再加上当前单元格的进入代价i+1(因为j=0,进入代价为(i+1)*1=i+1)。f[1][0] = f[1][0] + f[0][0] + 1 + 1(初始f[1][0]为3,f[0][0]为1,结果为3+1+1+1=6)。waitCost[i][j]的初始值)加上左边或上边单元格累积代价的最小值,再加上当前单元格的进入代价(i+1)*(j+1)。min(f[1][0], f[0][1]) + (1+1)*(1+1) = min(6,4) + 4 = 4 + 4 = 8,然后加上初始f[1][1]=2,结果为10。f[m-1][n-1]即为最小总代价。在示例中,f[1][2]最终计算为16。需要注意的是,题目描述的交替规则(奇数秒移动、偶数秒等待)在代码中并未显式处理。代码实际上实现了一个标准的最小路径和DP,其中每个单元格的代价是进入代价,而等待代价可能通过初始waitCost矩阵的修改被间接包含,但从代码逻辑看,等待代价未被正确集成。输出结果与题目示例匹配的原因可能是DP计算巧合地覆盖了实际代价。
f矩阵(即waitCost)作为DP表,未使用额外空间(除了少量变量)。因此,额外空间复杂度为O(1)。总之,代码通过动态规划计算路径代价,但简化了题目规则。实际应用中,如需严格处理交替移动和等待,可能需要更复杂的状态设计。
.
package main
import (
"fmt"
)
func minCost(m, n int, f [][]int)int64 {
f[0][0] = 1
f[m-1][n-1] = 0
for j := 1; j < n; j++ {
f[0][j] += f[0][j-1] + j + 1
}
for i := 1; i < m; i++ {
f[i][0] += f[i-1][0] + i + 1
for j := 1; j < n; j++ {
f[i][j] += min(f[i][j-1], f[i-1][j]) + (i+1)*(j+1)
}
}
returnint64(f[m-1][n-1])
}
func main() {
m := 2
n := 3
waitCost := [][]int{{6, 1, 4}, {3, 2, 5}}
result := minCost(m, n, waitCost)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def min_cost(m, n, f):
f[0][0] = 1
f[m-1][n-1] = 0
for j in range(1, n):
f[0][j] += f[0][j-1] + j + 1
for i in range(1, m):
f[i][0] += f[i-1][0] + i + 1
for j in range(1, n):
f[i][j] += min(f[i][j-1], f[i-1][j]) + (i+1)*(j+1)
return f[m-1][n-1]
# 测试
if __name__ == "__main__":
m, n = 2, 3
wait_cost = [[6, 1, 4], [3, 2, 5]]
print(min_cost(m, n, wait_cost)) # 输出结果
.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int minCost(int m, int n, vector<vector<int>>& f) {
f[0][0] = 1;
f[m-1][n-1] = 0;
for (int j = 1; j < n; j++)
f[0][j] += f[0][j-1] + j + 1;
for (int i = 1; i < m; i++) {
f[i][0] += f[i-1][0] + i + 1;
for (int j = 1; j < n; j++)
f[i][j] += min(f[i][j-1], f[i-1][j]) + (i+1)*(j+1);
}
return f[m-1][n-1];
}
int main() {
vector<vector<int>> waitCost = {{6, 1, 4}, {3, 2, 5}};
cout << minCost(2, 3, waitCost) << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。