朋友圈的一个编程题目。如下是本人的分析和答案。

抢劫犯问题

问题描述:

假如你是一个职业抢劫犯,你打算洗劫一个街道。每一个房子里有一定数量的钱。限制你的唯一条件是,
相邻的房子的安保系统是相连的。如果你抢劫相邻的房子,那么安保系统就会惊动警察。

给定一个非负整数的列表代表每个房子当中的钱,计算在不惊动警察的情况下你可以抢劫到的最多的钱。

输入样例:第一行为数列
4
0 2 3 4
5
1 3 0 3 10
输出样例:
6
13

问题分析:

递归思路:

针对n个数据,记最大累加和为F(n)(n>=3)。
对于F(n-1)和F(n-2),如果:

  1. F(n-1) == F(n-2),则a(n-1)未计入F(n-1),此时F(n) = F(n-2) + an
  2. F(n-1) > F(n-2),则a(n-1)计入F(n-1),此时F(n) = max(F(n-2) + an, F(n-1))
  3. F(1) = a1
  4. F(2) = max(a1, a2)

这个递归算法,时间复杂度和空间复杂度都是O(n^2),我们必须优化一下,将递归展开为迭代形式。
优化后的算法,时间复杂度为O(n),空间复杂度为O(1)。

解答:

#include <iostream>
using namespace std;unsigned int fun(unsigned int * const a, int n)
{unsigned int f1 = 0, f2 = 0, fn = 0;if (n == 1)return a[0];else if (n == 2)return a[1] > a[0] ? a[1] : a[0];else if (n >= 3) {f1 = a[0];fn = f2 = a[1] > a[0] ? a[1] : a[0];for (int i = 2; i < n; i++) {f1 = f2;f2 = fn;if (f2 == f1)fn = f1 + a[i];else if (f2 > f1)fn = f1 + a[i] > f2 ? f1 + a[i] : f2;}return fn;}return 0;
}int main()
{unsigned int *a;int n;while (cin >> n){a = new unsigned int[n];for (int i = 0; i < n; i++){cin >> a[i];}cout << fun(a, n) << endl;delete[] a;}return 0;
}

迭代法求解抢劫犯问题相关推荐

  1. 非线性方程组牛顿迭代法matlab,matlab实现牛顿迭代法求解非线性方程组

    <matlab实现牛顿迭代法求解非线性方程组>由会员分享,可在线阅读,更多相关<matlab实现牛顿迭代法求解非线性方程组(5页珍藏版)>请在人人文库网上搜索. 1.matla ...

  2. python牛顿法解非线性方程组_matlab实现牛顿迭代法求解非线性方程组.pdf

    matlab实现牛顿迭代法求解非线性方程组.pdf matlab 实现牛顿迭代法求解非线性方程组实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cosx2*x3-1/20 x12-81 ...

  3. 雅克比(Jacobi)迭代法求解线性方程组

    长博文不利于翻阅,于是又将Jacobi迭代法单独出来了. 这篇博文把高斯-赛德尔迭代法和雅克比迭代法都放到一起了,个人觉得看着有点累.(迭代法求解线性方程组),不过还是要看的,因为它引出了迭代法. 进 ...

  4. 迭代法求解线性方程组的收敛问题总结

    本讲之前,先将高斯-赛德尔迭代法和雅克比迭代法以及迭代法求解线性方程组贴出来,毕竟收敛问题研究的是迭代方法的收敛问题. 进入主题: 判断迭代法收敛的办法: 1.首先根据方程组的系数矩阵A的特点判断: ...

  5. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...

    [数学知识]非线性方程求解的二分法以及牛顿迭代法 本博客不谈及理论推导,只提供代码实现,关于理论推导,大家可以查看其它博客文章. 导入包 import sys import math import s ...

  6. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yyywww666/article/details/42805071 算法介绍(迭代法介绍): 代码C ...

  7. 迭代法求解贝尔曼期望方程的数学证明

    强化学习的核心是用迭代法求解马尔可夫决策过程(MDP)的贝尔曼期望方程(Bellman Optimality Equation): V(s)=Rs+γ∑s′∈SPss′V(s′)V(s) = R_s ...

  8. mysql 立方根函数_Java实现牛顿迭代法求解平方根、立方根

    一.简介 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法. ...

  9. 用matlab求解jacobi,用jacobi迭代法求解线性方程,求助matlab大师

    问题描述: 用jacobi迭代法求解线性方程,求助matlab大师 用jacobi迭代法求解线性方程 9x1-x2+x3=10 -x1+10x2-2x3=7 -2x1+x2+10x3=6,设迭代初值为 ...

最新文章

  1. 原生js循环展示dom_【前端面试】用一道题讲 js 的事件循环队列
  2. 聊聊 cookie 管理那些事
  3. 在python中len表示的数据类型是_python基本数据类型学习
  4. gnutls_handshake() failed: Illegal parameter
  5. Qt笔记-QProcess带管道符号运行及获取进程启动时间(Linux)
  6. springmvc多文件上传
  7. 思科路由器端口映射配置实例
  8. Android中图像变换Matrix的原理应用
  9. 字符串连接类(Javascript)
  10. 关于微信小程序的视频的坑
  11. 缅因大学欧洛诺分校计算机科学,缅因大学申请要求高不高?开学时间是什么时候?...
  12. 使用JavaFX完成刽子手游戏
  13. 贝格尔编排法之C++版
  14. R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
  15. 好文章要收藏_漫谈IT毕业生职业规划
  16. 机器学习之ROC曲线理解
  17. 4G DTU 透传模块简单使用方法
  18. 洛谷 P1827 [USACO3.4] 美国血统 American Heritage
  19. Windows 7 下安装TensorFlow
  20. 王者荣耀s12赛季服务器维护,王者荣耀S12赛季段位继承表 S12段位重置规则介绍...

热门文章

  1. 人是怎么把天聊死的(引以为鉴)
  2. 变限积分函数的求导(终极版神器)
  3. 烽火通信ECC升级转换S4项目的实施方法和价值收益
  4. linux mdadm 源码,Linux下软RAID管理工具mdadm的基本操作实践
  5. python 批量修改文件名
  6. learun开发学堂:何为敏捷开发?
  7. LDA 吉布斯采样(Gibbs Sampling)的公式推导
  8. Python TypeError: Object of type ‘Decimal‘ is not JSON serializable 类型错误 无法json
  9. 七牛云一站式 SSL 证书服务上线,即刻使用最多可省近 7 万
  10. 从USGS网站,使用python下载landsat影像,可以批量,修改版