首页 > 其他分享 >摘樱桃II

摘樱桃II

时间:2025-01-11 12:54:22浏览次数:1  
标签:状态 int robot1 II 樱桃 vector grid

摘樱桃II

“作为一个合格的程序员,理应具有修bug修到凌晨4点的魄力”

戳我查看原题。

题目大意


给定一个矩阵,矩阵中的每个数代表该点的樱桃个数。Robot1、Robot2分别从左上角与右上角出发,每次只能选择向正下方、左下方、右下方三个方向移动去采摘樱桃,到达矩阵的最后一行终止。若Robot1与Robot2到达同一个位置,则只有一个Robot可以获得到该点的樱桃。求Robot1与Robot2所能采摘到的最大樱桃数;

思路

这是一道简单的dfs,直接记忆化暴力搜索!(误

本人采用的是dp;由于R1与R2只能向3个方向前进,所以可以看作简单二维dp板子题的进阶版(板子题链接):统计每一层R1与R2所有可能出现的状态,在每个状态的多种不同的可能值中去取最大值作为该状态的最优解,接着在最后一层中选择樱桃最多的状态输出就能完美解决该问题。

如何记录每一层R1与R2的状态

开一个三维状态数组f[t][i][j],t表示层数,i表示robot1的状态,j表示robot2的状态;

如何推得状态方程

在理想状态下对于某一状态f[t][i][j]的robot1与robot2都有三种不同的来源,以robot1为例:位于第t层(行)第i列的robot1可以由位于第t-1层(行)第i列或第i-1列或第i+1列得到,于是乎我们便可得到f[t][i][j]的上一状态,写作状态方程为:

f[t][i][j]=max(

{f[ t - 1 ][ i ][ j ],f[ t - 1 ][ i - 1 ][ j ],f[ t - 1][ i + 1 ][ j ],

f[ t - 1 ][ i ][ j - 1 ],f[ t - 1 ][ i - 1 ][ j - 1 ],f[ t - 1 ][ i + 1 ][ j - 1 ],

f[ t - 1 ][ i ][ j + 1 ],f[ t - 1 ][ i - 1 ][ j + 1 ],f[ t - 1 ][ i + 1 ][ j + 1 ]})+grid[ t ][ i ] + grid[ t ][ j ];(grid表示该点的樱桃数)

范围问题

对于robot1,若它每次都向右下方前行则i=t,t即为i的上值;同时,我们不难推出robot2与robot1相遇是一个必然会被舍弃的情况,所以i同时也要小于j,既0<i<=min( t , j - 1 );同理我们也可以推出j的取值范围:max( i + 1 , n - t +1 )<=j<=n;

代码

点击查看代码
class Solution {
public:
    int cherryPickup(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size(),rema=0;//rema用来记录达到最后一层时的最大值
        vector<vector<vector<int>>> f(m+1,vector<vector<int>>(n+2, vector<int>(n+2,0)));//建立状态数组,f[t][i][j]中t表示层数,i表示robot1的状态,j表示robot2的状态;
//有关三维vector的初始化有兴趣的可以去了解一下(申桑也是写这个题时才会的……)
        f[1][1][n]=grid[0][0]+grid[0][n-1];//起始状态(第一层)的初始化
        int di[]={1,1,1,0,0,0,-1,-1,-1},dj[]={0,-1,1,0,-1,1,0,-1,1};//定义向量数组,图论常用
        
        for(int t=2;t<=m;t++){//从第二层开始
            for(int i=1;i<min(t+1,n);i++){//注意范围!!!是谁范围写错改了一个多小时我不说(
                for(int j=n;j>max(i,n-t);j--){
                    for(int d=0;d<9;d++){//向量的使用
                        int x=i+di[d],y=j+dj[d];//用xy存储上一状态,也方便检测范围是否合法
                        if(x>0&&x<min(t+1,y)&&y>max(x,n-t)&&y<=n){
                            f[t][i][j]=max(f[t][i][j],f[t-1][x][y]);//先找出最大的上一状态
                        }
                    }
                    f[t][i][j]+=(grid[t-1][i-1]+grid[t-1][j-1]);//加上该状态r1r2的值
                    if(t==m)rema=max(rema,f[t][i][j]);//到达最后一层时开始筛选最大的末状态
                }
            }
        }
        return rema;//返回末状态
    }
};

特殊鸣谢!

@PeachyGalaxy
(多谢万能的学姐教我写博客)
@码字好累申请中译中汉化组
(其实是我自己,码字太累了想吐槽(lll¬ω¬) )

标签:状态,int,robot1,II,樱桃,vector,grid
From: https://www.cnblogs.com/Xhita/p/18665342

相关文章

  • FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )
    以Xilinx公司Virtex-II系列FPGA为例,其基本结构由下图所示。它是主要由两大部分组成:可编程输入/输出(ProgrammableI/Os)部分和内部可配置(ConfigurableLogic)部分。可编程输入/输出(I/Os)部分主要提供芯片与外界电路的交互接口,完成不同电气特性下对输入输出信号驱动与匹配的要......
  • CH5XX 软件模拟iic驱动SHT21
    本文使用CH592X软件模拟iic驱动SHT21,1.i2c.c#include"i2c.h"#include"CH59x_common.h"#defineIIC_SCL_PINGPIO_Pin_15//PB15-SCL#defineIIC_SDA_PINGPIO_Pin_14//PB14-SDA#defineIIC_SCL_H()R32_PB_DIR&=~IIC_SCL_PIN#defineIIC_SC......
  • STM32驱动0.96寸OLED基于 “软/硬IIC协议”
    一、简介      本章讲解模拟IIC和硬件IIC驱动方式,软件IIC可以使用任意GPIO进行模拟,比较灵活,但是速率和稳定性不如硬件IIC,硬件IIC由单片机硬件自主完成时序,并支持多种速率模式,在资源充足情况下推荐使用硬件IIC。二、0.96寸OLED模块介绍    2.1简介:  ......
  • IIC的上拉电阻的设置需要考虑哪些因素
    在I²C(Inter-IntegratedCircuit)总线设计中,上拉电阻(Pull-upResistor)的设置非常重要,因为它直接影响总线的信号完整性、通信速度和功耗。以下是设置I²C上拉电阻时需要考虑的关键因素:1. 总线电容(BusCapacitance)总线电容的来源:PCB走线的寄生电容。连接设备的输入电容。......
  • 检测相邻递增子数组 II - LeetCode 3350 解题思路与代码解析
    检测相邻递增子数组II-LeetCode3350解题思路与代码解析在本篇博客中,我们将深入解析一道中等难度的算法题——检测相邻递增子数组II。通过这道题,我们将学习如何高效地处理数组中的递增子数组问题,并理解解决该问题的最佳策略。题目描述给定一个由n个整数组成的数组......
  • 3298.统计重新排列后包含另一个字符串的字符串数目 I II滑动窗口 优化思路解析全网最
    II相比于I是数据范围变成了10的6次方了我们来维护大小关系,把不用的都去掉,优化到O(26n)首先判断一下要找子字符串的s长度是否小于t字符串,如果小于的话直接返回0初始答案变量和left左指针为0用Counter来记录t中所有字符出现次数(当然记录s字符串出现次数也是可以的)然后......
  • 350. 两个数组的交集 II
    两个数组的交集II给你两个整数数组nums1和nums2,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2......
  • 【20241030】【Python基础教程】第二章 列表和元组 II
    第二章列表与元组II切片切片用来访问特定范围内的元素。使用两个索引,并且用冒号分隔:代码:website='www.Ilovechina.com'print(website[6:10])#第一个索引是包含的第一个元素的编号,但第二个索引是切片后余下的第一个元素的编号print(website[8:-4])#-4是倒数第四个......
  • 变异凯撒-python脚本调整ascii码转字符串
    题目:加密密文:afZ_r9VYfScOeO_UL^RWUc格式:flag{}结合题目变异凯撒,第一个字符a到f加了5,第二个字符f到l加了6,推断每个字符都在前一个字符基础上+1.编写python脚本:#定义字符串str="afZ_r9VYfScOeO_UL^RWUc"#定义偏移量k,初始值为5k=5#遍历字符串中的每个字符for......
  • 利用Python实现温度转换 II
    温度的刻画有两个不同体系:摄氏度(Celsius)和华氏度(Fahrenheit)。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪......