leetcode 3651

3651: 带传送的最小路径成本

如果没有传送,本题就是leetcode 64:最小路径和。注意本题不计入起点的值。

在有传送的情况下,可以用一个额外的维度表示传送次数。定义 fti+1j+1 表示++在恰好使用 t 次传送的情况下,从左上角 (0,0) 到 (i,j) 的最小总成本。++

传送条件只依赖于格子的数值,而不依赖于位置。

min_f x 表示++格子值为 x++的最小状态值(如果不存在则为 ∞)。【从左上角 (0,0) 到任一格子值为x中的最小总成本】

suf_min_f x 表示格子值 >=x 的最小状态值。计算方法:倒序遍历min_f,一层一层更新格子值 >=x 的最小状态值。(最大格子值为mx)

复制代码
//更新后缀最小值
for(int i=mx;i>=0;i--){
    suf_min_f[i]=min(suf_min_f[i+1],min_f[i]);
}

答案为 fkmn。虽然题目要求使用「至多」k 次传送,但由于我们可以原地传送,所以传送的次数越多,总成本是不会增大的。所以「至多」k 次传送等于「恰好」k 次传送。

代码实现时,f 数组的前两个维度可以优化掉。

复制代码
class Solution {
public:
    int minCost(vector<vector<int>>& grid, int k) {
        int n=grid[0].size();
        int mx=0;
        for(auto& row:grid){
            mx=max(mx,ranges::max(row)); //找到最大的格子值x
        }
        vector<int> suf_min_f(mx+2,INT_MAX);
        vector<int> min_f(mx+1);
        vector<int> f(n+1);
        for(int t=0;t<=k;t++){
            ranges::fill(min_f,INT_MAX);
            //最小路径和(空间优化写法)
            ranges::fill(f,INT_MAX/2);
            f[1]=-grid[0][0]; //起点的成本不算
            for(auto& row:grid){
                for(int j=0;j<n;j++){
                    int x=row[j];
                    f[j+1]=min(min(f[j],f[j+1])+x,suf_min_f[x]);
                    min_f[x]=min(min_f[x],f[j+1]);
                }
            }
            //倒序计算后缀最小值,供下一轮t+1使用
            for(int i=mx;i>=0;i--){
                suf_min_f[i]=min(suf_min_f[i+1],min_f[i]);
            }
        }

        return f[n];
    }
};
相关推荐
爱刷碗的苏泓舒2 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽4 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米5 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
WL学习笔记5 小时前
堆(数据结构)
数据结构·
星空露珠5 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA7 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel7 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客7 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
风栖柳白杨7 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试
闪电悠米9 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵