首页 > 其他分享 >leetcode 刷题

leetcode 刷题

时间:2025-01-14 13:00:41浏览次数:3  
标签:return int memo dfs frame 珠宝 leetcode 刷题

现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:

  • 只能从架子的左上角开始拿珠宝
  • 每次可以移动到右侧或下侧的相邻位置
  • 到达珠宝架子的右下角时,停止拿取

注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如 frame = [[0]]

示例 1:

输入:frame = [[1,3,1],[1,5,1],[4,2,1]]
输出:12
解释:路径 1→3→5→2→1 可以拿到最高价值的珠宝

动态规划:

int dfs(int ** memo,int** frame,int n,int m){
    if(n < 0 || m < 0){
        return 0;
    }
    if(memo[n][m] != -1){
        return memo[n][m];
    }else{
        memo[n][m] = fmax(dfs(memo,frame,n-1,m),dfs(memo,frame,n,m-1)) + frame[n][m];
        return memo[n][m];
    }
}
int jewelleryValue(int** frame, int frameSize, int* frameColSize) {
    int N = frameSize,M = frameColSize[0];
    int** memo = (int**)malloc(N*sizeof(int*));
    for(int i = 0;i < N;i++){
        memo[i] = (int*)malloc(M*sizeof(int));
        for(int j = 0;j < M;j++){
            memo[i][j] = -1;
        }
    }
    int result = dfs(memo,frame,N-1,M-1);
    for(int i = 0;i < N;i++){
        free(memo[i]);
    }
    free(memo);
    return result;
}

如果有负数,下面这段代码就不适用了

    if(n < 0 || m < 0){
        return 0;
    }

因为假如一路选过来都是负数,fmax()中一个是越界访问值0,另一个是负数,那么较大值是0,就出错了,应更改为:

if(n < 0 || m < 0){
    return -INT_MAX;
}

当有负数时还有一种情况就是行列下标都为零时,此时dfs[0][0] = fmax(dfs[-1][0],dfs[0][-1]) + frame[0][0] ,一定是负无穷,又不对了。所以对这个点要单独讨论。

if( ==0 && m==0){
    return frame[0][0];
}

标签:return,int,memo,dfs,frame,珠宝,leetcode,刷题
From: https://blog.csdn.net/2402_87235067/article/details/145119418

相关文章

  • LeetCode:215.数组中的第K个最大元素
    LeetCode:215.数组中的第K个最大元素解题思路看到“第K个最大元素”。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过K,就删除堆顶。插入结束后,堆顶就是第K个最大元素。leetcode在线运行测试可能是用本地环境跑分...有缓存卡大数有er......
  • leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表
    四、题目之:代码随想录https://programmercarl.com/(1)代码随想录:数组704.二分查找classSolution{publicintsearch(int[]nums,inttarget){if(target<nums[0]||target>nums[nums.length-1]){return-1;}intleft=0......
  • SQL刷题快速入门(二)
    其他章节:SQL刷题快速入门(一)承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分运算符SQL支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下是一些常见的SQL运算符类型及其示例:算术运算符+(加)-(减)*(乘)/(除)%(取模)SELECT......
  • LeetCode Top Interview 150 - Stack
    Somescenarioswhereastackistypicallytheappropriatedatastructuretouse:1.ParenthesesMatching:Problemsthatrequirecheckingforbalancedparenthesesorbracketsoftenutilizestackstoensurethateveryopeningbrackethasacorrespondingclo......
  • java面试刷题系统设计论文+源码 2025毕设
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着就业市场竞争的日益激烈,面试在求职过程中的重要性愈发凸显。如今,计算机技术的广泛应用为面试准备提供了新的途径。在传统的面试准备过程中,求......
  • LeetCode 热题 HOT 100
    点个关注,不迷路!(╯▽╰)好香~~在学习过程中,借助一些优秀的工具可以极大地提升我们的学习效率。例如,使用LeetCode插件,它能够帮助你显示力扣周赛难度分数,让你更好地了解题目的难度,从而合理安排学习计划。算法学习路线推荐基础夯实:先过B站“灵茶山艾府”的“基础算法......
  • leetcode周赛432 T4(单调栈 + 单调队列)
    一道练习单调栈+单调队列的好题题目链接:problem对于求合法子数组数量的题目,可以先考虑传统的枚举右端点,二分左端点的套路。此题用这种方法恰好可行,因为对于一个序列,左端增加一个数不会让操作数更少。因此对于固定右端点,合法的左端点一定是一段区间。所以现在问题转化为:用双指......
  • LeetCode刷题笔记(Day3)【滑动窗口+螺旋矩阵】
    题号:209.长度最小的子数组力扣题目链接        【注意】:数组所有元素之和都小于target时,要设置返回0,否则会返回INT_MAX 904.水果成篮76.最小覆盖子串【T中字符不按顺序出现也算,T中可能包含重复字符】        76有示例没过去,贴在文章后面啦,希望......
  • 力扣leetcode 416.分割等和子集 动态规划 0-1背包
    题目:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums=[1,5,11,5]输出:true解释:数组可以分割成[1,5,5]和[11]。示例2:输入:nums=[1,2,3,5]输出:false解释:数组不能分割成......
  • 代码随想录刷题第五天
    今日任务  242.有效的字母异位词  349. 两个数组的交集  202. 快乐数 1. 两数之和 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例......