算法笔记|Day34动态规划VII

2024-08-26 06:12

本文主要是介绍算法笔记|Day34动态规划VII,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法笔记|Day34动态规划VII

  • ☆☆☆☆☆leetcode 198.打家劫舍
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 213.打家劫舍II
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 337.打家劫舍 III
    • 题目分析
    • 代码

☆☆☆☆☆leetcode 198.打家劫舍

题目链接:leetcode 198.打家劫舍

题目分析

1.dp数组含义:dp[i]表示考虑下标i(包括i)以内的房屋,最多可以偷窃的金额。;
2.递推公式:dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1])(如果偷第i个房间则为dp[i-2]+nums[i];如果不偷第i个房间则为dp[i-1],两者取最大值);
3.初始化:dp[0]=nums[0],dp[1]=Math.max(nums[0],nums[1])(dp[0]表示下标为0的房间最多偷窃的金额为nums[0],dp[1]表示从下标为0到1的房间最多偷窃的金额为Math.max(nums[0],nums[1]);
4.遍历顺序:从小到大。

代码

class Solution {public int rob(int[] nums) {if(nums.length==1)return nums[0];int dp[]=new int[nums.length];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<nums.length;i++)dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);return dp[nums.length-1];}
}

☆☆☆☆☆leetcode 213.打家劫舍II

题目链接:leetcode 213.打家劫舍II

题目分析

对于一个数组,成环主要有三种情况:①考虑不包含首尾元素;②考虑包含首元素,不包含尾元素;③考虑包含尾元素,不包含首元素。事实上情况②或③均包括情况①,所以仅需考虑情况②和③中的最大值即可。
1.dp数组含义:dp[i]表示考虑下标i(包括i)以内的房屋,最多可以偷窃的金额。;
2.递推公式:dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1])(如果偷第i个房间则为dp[i-2]+nums[i];如果不偷第i个房间则为dp[i-1],两者取最大值);
3.初始化:dp[0]=nums[0],dp[1]=Math.max(nums[0],nums[1])(dp[0]表示下标为0的房间最多偷窃的金额为nums[0],dp[1]表示从下标为0到1的房间最多偷窃的金额为Math.max(nums[0],nums[1]);
4.遍历顺序:从小到大。

代码

class Solution {public int rob(int[] nums) {if(nums.length==1)return nums[0];return Math.max(rob1(nums,0,nums.length-2),rob1(nums,1,nums.length-1));}public int rob1(int[] nums,int start,int end){if(start==end)return nums[start];int dp[]=new int[end-start+2];dp[start]=nums[start];dp[start+1]=Math.max(nums[start],nums[start+1]);for(int i=start+2;i<=end;i++)dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);return dp[end];}
}

☆☆☆☆☆leetcode 337.打家劫舍 III

题目链接:leetcode 337.打家劫舍 III

题目分析

1.dp数组含义:dp[0]表示不偷该节点最多可以偷窃的金额,dp[1]表示偷该节点最多可以偷窃的金额;
2.递推公式:dp[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1])(不偷该节点,要考虑左右子节点最多偷窃的金额总和,且左右子节点各自偷窃的金额最多为偷该节点与不偷该节点的最大值),dp[1]=root.val+left[0]+right[0](偷该节点,最多偷窃的金额总和为该节点金额与左右节点不偷最多偷窃的金额的和);
3.初始化:如果root=null,则返回{0,0}];
4.遍历顺序:后序遍历(左右中)。

代码

class Solution {public int rob(TreeNode root) {return Math.max(traversal(root)[0],traversal(root)[1]);}public int[] traversal(TreeNode root){int dp[]=new int[2];if(root==null)return dp;int left[]=traversal(root.left);int right[]=traversal(root.right);dp[0]=Math.max(left[0],left[1])+Math.max(right[0],right[1]);dp[1]=root.val+left[0]+right[0];return dp;  }
}

这篇关于算法笔记|Day34动态规划VII的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1107771

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个