算法学习010-打家劫舍 c++动态规划算法实现 中小学算法思维学习 信奥算法解析

devtools/2024/10/9 11:22:14/

目录

C++打家劫舍

一、题目要求

1、编程实现

2、输入输出

二、算法分析

三、程序编写

四、运行结果

五、考点分析

六、推荐资料


C++打家劫舍

一、题目要求

1、编程实现

你是⼀个专业的⼩偷,计划偷窃沿街的商铺 。每间商铺 都藏有⼀定的现⾦,影响你偷窃的唯⼀制约因素就是相邻的商铺 装有相互连通的防盗系统,如果两间相邻的商铺 在同⼀晚上被⼩偷闯⼊,系统会⾃动报警。
给定⼀个代表每个商铺 存放⾦额的⾮负整数数组,计算你 不触动警报装置的情况下 ,⼀夜之内能够偷窃到的最⾼⾦额。

2、输入输出

输入描述:第一行输入沿街商铺的个数n(1<=n<=100)

                  第二行输入n个数

输出描述:只有一行,一个整数,即一夜只能够偷窃到的最高金额

输入样例:

10
5 7 3 6 4 5 9 8 13 11

输出样例:

7

二、算法分析

  1. 从给定题目的初步分析可以看出,针对每一个商铺都有两种情况
  2. 一种是偷,另一种就是不偷
  3. 而当前商铺是否偷取决于前一个商铺和前两个商铺是否被偷
  4. 如果前一个商铺被偷,那当前商铺就不能偷
  5. 如果前一个商铺没有被偷,那当前商铺就可以偷
  6. 所以可以采用动态规划的方式实现
  7. 设置动态数组dp[i],i表示第几个商铺;dp[i]就是表示包括第i个商铺在内的能偷到的最大金币
  8. 经上面分析第i个商铺能偷到的最大金币分成上面两种情况,偷或者不偷
  9. 所以可以得出对应的动态数组dp[i]的状态转移方为:dp[i]=max(dp[i-1],dp[i-2]+g[i-2])
  10. 数组g用来存储每间商铺能偷到的金币
  11. 从动态转移方程我们也可以看出后面的值都由前一个和前两个来决定,所以需要初始化dp数组的第1个和第2个值:dp[1]=g[1],dp[2]=max(g[1],g[2);即第一间商铺能偷到的最大值就是第一间商铺的金币,前两间商铺能能偷到的最大金币就是第一间和第二间商铺里面最大的值

三、程序编写

//程序中的dp和cost数组可以使用动态数组vector进行实现更好
#include<bits/stdc++.h>
using namespace std;
int dp[102];			//dp数组表示第i个商品能偷到的最大金额
int rob(int *g,int n)
{dp[1] = g[1];dp[2] = max(g[1],g[2]);for(int i=3;i<=n;i++)//当前商铺分两种情况偷和不偷,如果不偷那就是到第前一商铺偷的最大金币//如果偷那就是到第前二商品偷的最大金币加上当前商铺的金币dp[i] = max(dp[i-1],dp[i-2]+g[i]);return dp[n];
}
int main()
{int n,g[102];cin >> n;memset(g,0,sizeof(g));for(int i=1;i<=n;i++)cin >> g[i];cout << rob(g,n);return 0;
}

 本文作者:小兔子编程 作者首页:小兔子编程-CSDN博客

四、运行结果

10
5 7 3 6 4 5 9 8 13 1137

五、考点分析

难度级别:中等,这题相对而言在于确定动态规划算法,具体主要考查如下:

  1. 分析题目,找到解题思路
  2. 充分掌握变量和数组的定义和使用
  3. 学会动态规划算法的原理和使用
  4. 确定动态数组的定义和含义
  5. 分析出动态规划算法的状态转移方程以及遍历顺序
  6. 学会输入流对象cin的使用,从键盘读入相应的数据
  7. 学会for循环的使用,在确定循环次数的时候推荐使用学会
  8. 掌握输出流对象cout的使用,与流插入运算符 << 结合使用将对象输出到终端显示
  9. 学会分析题目,算法分析,将复杂问题模块化,简单化,从中找到相应的解题思路
  10. 充分掌握变量定义和使用、分支语句、循环语句和动态规划算法的应用

PS:方式方法有多种,小朋友们只要能够达到题目要求即可!

六、推荐资料

  • 所有考级比赛学习相关资料合集【推荐收藏】

http://www.ppmy.cn/devtools/38917.html

相关文章

纯血鸿蒙APP实战开发——数字滚动动效实现

介绍 本示例主要介绍了数字滚动动效的实现方案。 该方案多用于数字刷新&#xff0c;例如页面刷新抢票数量等场景。 效果图预览 使用说明&#xff1a; 下拉页面刷新&#xff0c;数字进行刷新。 实现思路 通过双重ForEach循环分别横向、纵向渲染数字。 Row() {ForEach(this…

电脑ip地址设置成什么比较好

随着信息技术的快速发展&#xff0c;IP地址已成为电脑在网络世界中的“身份证”。它不仅是电脑在网络中进行通信的基础&#xff0c;也直接关系到网络连接的稳定性、安全性和效率。然而&#xff0c;面对众多IP地址设置选项&#xff0c;许多用户可能会感到困惑。那么&#xff0c;…

力扣:1005. K 次取反后最大化的数组和

1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能…

自动化测试 selenium基础

前言 我们都知道测试开发工程师的任务是根据用户需求测试用例的同时,害的开发自动化工具来减轻测试压力且提高测试的效率以及质量,这一节我们就来简单谈谈开发简单的自动化工具基础 什么是自动化测试呢?就是将我们需要做的测试交给机器去做,也就是使用代码来模拟人对于机器的行…

HTML5 Canvas发光Loading动画源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果&#xff0c;相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的&#xff0c;整个loading动画是发光3D的视觉效果&#xff0c;HTML5非常强大。 …

每日一练 2024.5.10

题目&#xff1a; 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 示例 1&#…

word 毕业论文格式调整

添加页眉页脚 页眉 首先在页面上端页眉区域双击&#xff0c;即可出现“页眉和页脚”设置页面&#xff1a; 页眉左右两端对齐 如果想要页眉页脚左右两端对齐&#xff0c;可以选择添加三栏页眉&#xff0c;然后将中间那一栏删除&#xff0c;即可自动实现左右两端对齐&#x…

笔记本电脑怎么多选删除文件?误删除文件怎么办

在日常使用笔记本电脑中&#xff0c;我们可能会遇到需要删除大量文件的情况&#xff0c;例如清理临时文件、整理文档或卸载不再需要的程序。手动一个一个地删除不仅效率低下&#xff0c;还可能遗漏某些文件。那么&#xff0c;如何在笔记本电脑上高效地进行多选删除操作呢&#…