当前位置: 首页 > news >正文

力扣1463. 摘樱桃 II

力扣1463. 摘樱桃 II

题目

在这里插入图片描述

题目解析及思路

题目要求返回从左上角和右上角分别出发两个机器人摘樱桃的最大数量、

每个机器人可以往左下,正下,右下三个方向走

定义f[i][j+1][k+1]表示一个机器人从(i,j)出发,一个机器人从(i,k)出发的最多摘樱桃数量

边界:j=−1, k=−1

初始值:f[i][j][k] = 0 答案为f[0][1][m]

代码

class Solution {
public:
    int cherryPickup(vector<vector<int>>& grid) {
        int n = grid.size(),m = grid[0].size();
        vector<vector<vector<int>>> f(n + 1, vector<vector<int>>(m + 2, vector<int>(m + 2)));
        for(int i=n-1;i>=0;i--){
            //哪怕左上角的机器人一直往右下走,j也不会超过i,最多就相等,所以j>i的情况都不存在
            for(int j=0;j<min(m,i+1);j++){
                //哪怕右上角的机器人一直往左下走,k也不会超过m-i-1,最多就相等,所以这种情况都不存在
                //并且两机器人线路交叉也没意义,如果穿过去能更多,那更近的机器人应该自己走那条路,所以k>j
                for(int k=max(j+1,m-1-i);k<m;k++){
                    //九种情况取max:[j...j+2] × [k...k+2]
                    f[i][j+1][k+1] = max({
                        f[i + 1][j][k], f[i + 1][j][k + 1], f[i + 1][j][k + 2],
                        f[i + 1][j + 1][k], f[i + 1][j + 1][k + 1], f[i + 1][j + 1][k + 2],
                        f[i + 1][j + 2][k], f[i + 1][j + 2][k + 1], f[i + 1][j + 2][k + 2]
                    }) + grid[i][j] + grid[i][k];
                }
            }
        }
        return f[0][1][m];
    }
};

相关文章:

  • 存量思维和增量思维
  • Python代码调试方法集锦
  • 用DEEPSEEK做数据看板:高效、实用与创新的融合
  • android paging使用教程
  • open-webui+deepseek api实现deepseek自由
  • AI×电商数据API接口:深度融合,引领未来电商行业浪潮
  • Vulnhub-Node
  • leetcode69.x 的平方根
  • 《Python实战进阶》No16: Plotly 交互式图表制作指南
  • Python3 爬虫 爬虫中间件
  • AI系统架构
  • JS如何实现全选以及联动效果
  • Linux常见指令
  • leetcode-sql数据库面试题冲刺(高频SQL五十题)
  • MySQL第一次作业
  • ubuntu24.04-系统重装
  • fastapi+angular停车管理系统可跨域
  • MaxKB结合DeepSeek快速构建客服企业知识库
  • MySQL 用户与权限管理详解:从角色解锁到安全加固
  • Codemirror编辑器中引入其他语言支持的方式
  • 做外贸批发有哪些网站有哪些/重庆网站建设外包
  • 公司网站可以做无形资产么/如何快速推广
  • 公司的网络规划与设计/网站怎么优化推荐
  • 怎么查网站开发语言/三台网站seo
  • 什么行业适合做网站推广/移动建站优化
  • 单页网站制作程序/手机百度免费下载