题解 | #礼物的最大价值#

礼物的最大价值

https://www.nowcoder.com/practice/2237b401eb9347d282310fc1c3adb134

  1. 动态规划的总逻辑 res = grid[x][y] + fn(grid[x+1][y]) + fn(grid[x][y+1])
  2. 存在重复计算的部份,比如 res = grid[0][0] + fn(grid[0][1]) + fn(grid[1][0]) fn(grid[0][1]) 会去计算 grid[0][1] + fn(grid[0][2]) + fn(grid[1][1]) fn(grid[1][0]) 会去计算 grid[1][0] + fn(grid[1][1]) + fn(grid[0,2]) 可以看到fn(grid[1][1]) ,也就是数字5为起点,都会被重复计算,此时只需要算一遍就行。解决办法是将每个节点的为起点的结果,都记录到另一个二维数组中。
  3. 这里的rust实现,主要存储结果的数组,包裹了option,用于记录有没有计算过结果。----其实不用option也行
  4. 另外需要注意,对于index的访问,不要越界。处理办法是访问前先判断,对比inde和长度

1 3 1
1 5 1
4 2 1
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param grid int整型二维数组 
        * @return int整型
    */
    pub fn maxValue(&self, grid: Vec<Vec<i32>>) -> i32 {
        // write code here
        let mut flag: Vec<Vec<Option<i32>>> = vec![vec![None; grid[0].len()]; grid.len()];
        self.maxValue_dp(&grid,0,0,&mut flag)
    }

    pub fn maxValue_dp(&self,grid:&Vec<Vec<i32>>,x:usize,y:usize,flag:&mut Vec<Vec<Option<i32>>>) -> i32{
       // Check if we've already computed this value
        if let Some(value) = flag[x][y] {
            return value;
        }

        // Base case: reached the bottom-right corner
        if x == grid.len() - 1 && y == grid[0].len() - 1 {
            return grid[x][y];
        }

        // Recursive cases: move right or down
        let right = if x + 1 < grid.len() {
            self.maxValue_dp(grid, x + 1, y, flag)
        } else {
            // std::i32::MIN
            0
        };

        let down = if y + 1 < grid[0].len() {
            self.maxValue_dp(grid, x, y + 1, flag)
        } else {
            // std::i32::MIN
            0
        };

        // Choose the maximum value from moving right or down
        let max_path_value = grid[x][y] + right.max(down);

        // Memoize the result
        flag[x][y] = Some(max_path_value);

        max_path_value
    }
}

#rust#
全部评论

相关推荐

2025-11-13 19:44
哈尔滨工程大学 Java
二战小红书,又是二面挂,还是做不到。先吃饭吧。9.18小红书商业技术实习深挖分布式锁设置五分钟过期并在finally里释放锁会不会有释放不了的时候,看门狗机制如何实现,它的后台线程是什么类型spisynchronized,monitorexit执行两次你知道吗AQS垃圾回收器mysql锁redis过期删除,怎么选取过期key,数据量大的话这键值字典和过期字典会不会比较大手撕最长上升子序列9.24小红书商业技术实习FAQ的理解实习意图识别或者提示词这块有什么细节的困难,怎么解决的实习定时任务和kafka发消息这块实现细节,现在定时任务要扫描的数据变成亿级了该怎么设计实习问答匹配率提升20%怎么来的数据,分子分母是啥看你实习了挺久,没提转正吗如果offer比较多你如何选择无手撕11.10小红书风控工程介绍实习,参数提取检验补齐有了新业务意图是需要再扩展吗,意图识别提升10%哪来的,哪块是最有挑战的,系统吞吐量多少,用到哪些大模型了java注解,自己用过吗jvm内存模型mysql什么情况适合建索引kafka怎么消息去重linux查看端口被哪个进程占用命令手撕全排列11.12小红书风控工程考研辅导经历,考研成绩,本科成绩,为什么考研,高考为什么没考好,本科成绩平平研究生成绩不错是怎么转变的,为什么走工程不走算法实习经历,提取参数的过程中用户问别的会怎么样,挑战困难,转正情况kafka会丢失消息吗,消费者消费失败broker怎么感知到从而重新投递呢,消费者怎么知道自己从哪里重新拉取,消费成功后没及时记录offset会不会重复消费rpc过程怎么找到对应服务的,一直访问注册中心会不会压力大优缺点,自驱力高的原因,怎么做到长期坚持的,平时怎么学习,平时沟通也这么谨慎吗,有什么爱好进程线程,文件内容读到内存是单线程还是多线程好,磁盘是机械磁盘和固态磁盘对答案有影响吗大文件中内容都是单词,需要对单词排序,什么思路,会内存溢出吗无手撕
查看28道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务