三维dp,LeetCode 1463. 摘樱桃 II

embedded/2024/9/25 2:21:00/

目录

一、题目

1、题目描述

2、接口描述

python3

cpp

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解

python3

cpp


一、题目

1、题目描述

给你一个 rows x cols 的矩阵 grid 来表示一块樱桃地。 grid 中每个格子的数字表示你能获得的樱桃数目。

你有两个机器人帮你收集樱桃,机器人 1 从左上角格子 (0,0) 出发,机器人 2 从右上角格子 (0, cols-1) 出发。

请你按照如下规则,返回两个机器人能收集的最多樱桃数目:

  • 从格子 (i,j) 出发,机器人可以移动到格子 (i+1, j-1)(i+1, j) 或者 (i+1, j+1) 。
  • 当一个机器人经过某个格子时,它会把该格子内所有的樱桃都摘走,然后这个位置会变成空格子,即没有樱桃的格子。
  • 当两个机器人同时到达同一个格子时,它们中只有一个可以摘到樱桃。
  • 两个机器人在任意时刻都不能移动到 grid 外面。
  • 两个机器人最后都要到达 grid 最底下一行。

2、接口描述

python3
class Solution:def cherryPickup(self, grid: List[List[int]]) -> int:
cpp
class Solution {
public:int cherryPickup(vector<vector<int>>& grid) {}
};

3、原题链接

1463. 摘樱桃 II


二、解题报告

1、思路分析

和昨天的每日一题一样的思路,二者只能往左下,右下,下三个方向走,那么走同样步数的情况下二者处于同一层

我们定义状态f(i, j, k)表示robot1走到(i, j),robot2走到(i, k)时的最大收益

那么有递推:f(i, j, k) = max(dfs(i + 1, j, k), dfs(i + 1, j, k + 1), dfs(i + 1, j, k - 1), 
                            dfs(i + 1, j + 1, k), dfs(i + 1, j + 1, k + 1), dfs(i + 1, j + 1, k - 1),
                                dfs(i + 1, j - 1, k), dfs(i + 1,j - 1, k + 1), dfs(i + 1, j - 1, k - 1)) + grid[i][j] + (grid[i][k] if j != k else 0)

我们可以选择记忆化搜索也可以选择递推的方式,二者皆可

2、复杂度

时间复杂度: O(m * n * n)空间复杂度:O(m * n * n)

3、代码详解

python3
class Solution:def cherryPickup(self, grid: List[List[int]]) -> int:m = len(grid)n = len(grid[0])@cachedef dfs(i: int, j: int, k: int) -> int:if i >= m or j < 0 or j >= n or k < 0 or k >= n:return 0return max(dfs(i + 1, j, k), dfs(i + 1, j, k + 1), dfs(i + 1, j, k - 1), dfs(i + 1, j + 1, k), dfs(i + 1, j + 1, k + 1), dfs(i + 1, j + 1, k - 1),dfs(i + 1, j - 1, k), dfs(i + 1,j - 1, k + 1), dfs(i + 1, j - 1, k - 1)) + grid[i][j] + (grid[i][k] if j != k else 0)return dfs(0, 0, n - 1)
cpp
class Solution {
public:int cherryPickup(vector<vector<int>>& grid) {int m = grid.size(), n = grid[0].size();vector<vector<vector<int>>> f(m, vector<vector<int>>(n, vector<int>(n, -1)));function<int(int, int, int)> dfs = [&](int i, int j, int k){if(i >= m || j < 0 || j >= n || k < 0 || k >= n) return 0;int& res = f[i][j][k];if(~res) return res;res = grid[i][j] + (j != k) * grid[i][k] + max({ dfs(i + 1, j, k), dfs(i + 1, j, k + 1), dfs(i + 1, j, k - 1), dfs(i + 1, j + 1, k), dfs(i + 1, j + 1, k + 1), dfs(i + 1, j + 1, k - 1),dfs(i + 1, j - 1, k), dfs(i + 1,j - 1, k + 1), dfs(i + 1, j - 1, k - 1) });return res;};return dfs(0, 0, n - 1);}
};


http://www.ppmy.cn/embedded/35892.html

相关文章

今日分享【微信小程序中一个左右摇摆的小灯泡】

1、废话少说&#xff0c;先上效果&#xff1a; 2、具体实现代码如下&#xff1a; wxml <view class"con {{off?off:}}" catchtap"close"><view class"box {{off?off:}}"><view class"box_view {{off?off:}}">…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

R语言数据探索与分析-运用时间序列预测模型对成都市API进行预测分析

一、研究背景 “绿水青山就是金山银山&#xff0c;要让绿水青山变成金山银山”让人们深刻的意识到环境的重要性。与此同时&#xff0c;由于现代生活水平的不断提高&#xff0c;所带来的环境污染也不断增多&#xff0c;空气以及环境的污染带来了越来越多的疾病&#xff0c;深刻…

Faiss:高效相似度搜索与索引技术深度解析

Faiss&#xff1a;高效相似度搜索与索引技术深度解析 一、引言 在大数据时代&#xff0c;信息的海量化使得快速、准确地从海量数据中检索出相似信息变得至关重要。Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一个由Facebook AI团队开发的开源库&#xff0…

【前沿模型解析】一致性模型CM(一)| 离散时间模型到连续时间模型数学推导

文章目录 1 离散时间模型2 连续时间模型 得到 SDE 随机微分方程2.1 从离散模型到SDE的推理步骤 3 补充&#xff1a;泰勒展开近似 1 − β i \sqrt{1-\beta_i} 1−βi​ ​ CM模型非常重要 引出了LCM等一系列重要工作 CM潜在性模型的数学公式推导并不好理解 一步一步&#xf…

Spring管理第三方依赖

在开发中&#xff0c;我们常需要根据业务需求导入我们需要的第三方依赖包&#xff0c;本文主要以导入druid数据库来连接池为案例讲解有关spring管理第三方依赖 目录 纯注解文件注入 1.在pom.xml中导入依赖 2.在com.lcyy包下建立一个config包用于配置类的实现 3.在config包下…

【栈】Leetcode 1047. 删除字符串中的所有相邻重复项

题目讲解 1047. 删除字符串中的所有相邻重复项 算法讲解 使用栈这个数据结构&#xff0c;每一次入栈的时候观察此时的字符和当前栈顶字符是否相等&#xff0c;如相等&#xff1a;栈顶出栈&#xff1b;不相等&#xff1a;入栈 class Solution { public:string removeDuplica…

Backpropagation反向传播算法【总结】

概念介绍 Backpropagation本质上就是一个提升Gradient Descent效率的算法&#xff0c;核心在于其可以有效率地计算出一个偏移量来update下一组未知参数。 难点在于&#xff1a;Neural Network有很多层&#xff0c;而且每层参数都非常多&#xff0c;所以不能立即算出来该组未知…