线性dp:大盗阿福(打家劫舍)

news/2024/11/16 13:45:28/文章来源:https://www.cnblogs.com/Tomorrowland/p/18369823

大盗阿福

  • 本题与leetcode198题——打家劫舍的题意一模一样,阅读完本文以后可以尝试以下题目

力扣题目链接)

题目叙述:

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有N家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。作为一向谨慎作案的大盗阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入格式

  • 输入的第一行是一个整数T,表示一共有T组数据。
  • 接下来的每组数据,第一行是一个整数N,表示一有N家店铺。
  • 第二行是N个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过1000。

输出格式

  • 对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

输入样例:

2
3
1 8 2
4
10 7 6 14

输出样例:

8
24

样例解释:

  • 对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。对于第二组样例,阿福选择第1和4家店铺行窃获得的现金数量为10+14=24.

动态规划思路分析

  • 设我们打劫的店铺数量为i,获取的价值和为dp ,那么dp明显是i的一个函数,那么我们就用dp[i]作为状态变量,dp[i]表示偷前i家店铺所能获取的价值最大值

状态变量以及它的含义

  • 由上面分析可知,我们设立dp[i] 作为状态变量,并且dp[i]的含义是偷前i家店铺所能获取收益的最大值.

递推公式

  • 我们设dp[i] ,在i的这个位置有两种状态:
    • 1.第i家店铺不偷——dp[i]=dp[i-1]
    • 2.第i家店铺偷——dp[i]=dp[i-2]+w[i],w[i]为第i家店铺的价值

具体细节如下图所示:

  • img

遍历顺序:

  • 由上面两步分析可知,dp[i]的状态一定是由前面dp[i-1]dp[i-2],推出来的,所以说遍历顺序一定是从前向后遍历。

如何初始化?

  • 我们首先得处理好边界条件:dp[0]dp[1]怎么处理?
  • 偷前0家店铺的最大价值显然是0,偷前1家店铺的最大价值显然为w[1]
  • 处理好边界条件以后,我们再从前向后,依据递推公式进行递推就行了

举例验证dp数组

下标:1,2,3,4

w[i]:10,7,6,14

dp[i]:10,10,16,24

  • 通过样例2分析可知,我们的dp数组没有分析错。因此我们验证了我们的dp数组的正确性。

优化

  • 我们可以用dp[i-1]的状态直接推出dp[i]的状态。

  • 我们状态表示可以优化成:

    • f[i][0]表示不偷第i家店铺能获取的最大值
    • f[i][1]表示偷第i家店铺能获取的最大值
  • 那么我们的状态转移方程就可以从dp[i-1]推出,不偷第i家店铺,那么我们就可以偷第i-1家店铺,也可以不偷,我们选取这两个之中的最大值,如果偷第i家店铺的话,第i-1家店铺我们一定只能选择不偷。

    • 不偷:dp[i][0]=max(dp[i-1][0],dp[i-1][1])
    • 偷:dp[i][1]=dp[i-1][0]+w[i]

    img

优化后的边界处理:

  • 不偷第1家店铺:f[i][0]=0
  • 偷第1家店铺:f[i][1]=w[1]

优化后的代码处理:

scanf("%d",&t)while(t--){scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&w[i]);f[1][0]=0;f[1][1]=w[1];for(int i=2;i<=n;i++){f[i][0]=max(f[i-1][0],f[i-1][1]);f[i][1]=f[i-1][0]+w[i];}printf("%d\n",max(f[n][0],f[n][1]));}

总结:

img

  • 我们上面讲述的两种方法,第一种方法叫做分步转移,第二种方法叫做分类转移,在有些情况下,二者都能使用,而在某些题目当中,只能使用分类转移的方法,我们在以后也会介绍的!希望大家能理解这两种做法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786432.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nexpose v6.6.266 for Linux Windows - 漏洞扫描

Nexpose v6.6.266 for Linux & Windows - 漏洞扫描Nexpose v6.6.266 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Aug 21, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:…

扫描线总结

扫描线是线段树的典型应用。这玩意不难,用途也比较狭窄,重点在理解思想。例 0 【模板】扫描线 题意 求 \(n\) 个四边平行于坐标轴的矩形的面积并。 对于 \(100\%\) 的数据,\(1 \le n \le {10}^5\),\(0 \le x_1 < x_2 \le {10}^9\),\(0 \le y_1 < y_2 \le {10}^9\)。…

Pollard-Rho学习笔记

1.利用最大公约数求出一个约数 n和某个数的公约数一定是n的约数,即\(\forall k \in\mathbf{N}_{+},\gcd(k,n) \mid n\),只要选取适当的k使得\(1<\gcd(k,n)< n\),,就能够求得n的一个约数 满足这个条件的k很多,n的因数的大部分倍数都可行 我们通过\(f(x)=(x^2+c)\bmod…

DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作

DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期制作 Blackmagic Design DaVinci Resolve Studio 请访问原文链接:https://sysin.org/blog/davinci…

读软件开发安全之道:概念、设计与实施07密码学(上)

密码学1. 加密工具 1.1. 加密工具之所以没有得到充分使用,就是因为人们往往认为密码学是一个准入门槛极高的专业领域 1.2. 如今的加密学大部分都源自纯数学,所以只要能够正确使用,加密学确实行之有效1.2.1. 不代表这些算法本身确实无法破解,而是需要数学领域出现重大突破才…

004.MinIO-DirectPV分布式存储部署

MinIO部署介绍 部署概述 Kubernetes hostpath、local和本地静态配置都存在需要事先在node节点准备好可用的块存储或文件系统,例如对插入的硬盘,或者磁盘阵列做分区格式化,文件系统则需提前创建好Kubernetes即将利用的挂载目录,并且两种方法都会有亲和性限制,无法做到让Kub…

dotnet 默认创建的 JsonContent 没有 Content Lenght 的内容头

本文记录一个 dotnet 的设计问题,默认创建出来的 JsonContent 对象的 Headers 里,是没有 Content-Length 信息的如下面代码创建一个 JsonContent 对象 using System.Net.Http.Json;var foo = new Foo();var jsonContent = JsonContent.Create(foo);class Foo {public int Val…

dotnet X11 多次调用 XPutImage 是否能做到渲染同步

本文将告诉大家我在麒麟系统和统信系统以及分别搭配飞腾和兆芯处理器的设备上,使用连续的 XPutImage 方法推送界面,测试是否能够在一次渲染内完成。测试结论是不能做到渲染同步本文的核心测试代码如下XPutImage(display, handle, gc, ref xImage, @event.ExposeEvent.x, @eve…

dotnet C# 结构体出方法弹栈之后的行为

本文记录我在 .NET 9 里测试的行为,在方法里面创建的在栈上的结构体,在方法执行结束之后,栈上的结构体将会被弹栈进入不受管理区域,此时的结构体内存内容不会立刻被清空或被改写这是我在对 dotnet X11 栈空间被回收导致调用 XPutShmImage 闪退 博客的内容进行更多的测试,确…

Tesla 开发者 API 指南:BLE 密钥 – 身份验证和车辆命令

注意:本工具只能运行于 mac 或者 linux, win下不支持。 1. 克隆项目到本地 https://github.com/teslamotors/vehicle-command.git 2. 项目根目录下执行命令 go get ./... go build ./... go install ./... cd cmd cd tesla-control go build 3. 生成密钥 生成私钥 openssl e…

it程序员常用的技术社区网站有哪些?

it程序员常用的技术社区网站有哪些??作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,技术人员经常会在各种技术交流社区游逛。优秀的实时开发社区确实能帮你积累不少开发经验1、gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一…

推荐7款美观且功能强大的WPF UI库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里提问:WPF有什么好用或者好看的UI组件库推荐的?,今天大姚给大家分享7款开源、美观、功能强大、简单易用的WPF UI组件库。 WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵…