一道有关动态规划(Dynamic Programming)的网易面试题

动态规划(Dynamic programming)详解 动态规划(Dynamic programming,简称DP)是一种将复杂问题分解成很多子问题,并将子问题的求解结果存储起来避免重复求解的一种算法。动态规划一般用来解决最优问题。而解决问题的过程,需要经历多个决策阶段。每个决策阶段都对应着一组状态。最后通过一组决策序列(动态转移方程),产生最终期望的最优解。 能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。 阅读详情

最近遇到一道很经典的有关动态规划的网易面试题:

小Q和牛博士合唱一首歌曲,这首歌曲由n个音调组成,每个音调由一个正整数表示。
对于每个音调要么由小Q演唱要么由牛博士演唱,对于一系列音调演唱的难度等于所有相邻音调变化幅度之和, 例如一个音调序列是8, 8, 13, 12, 那么它的难度等于|8 - 8| + |13 - 8| + |12 - 13| = 6(其中||表示绝对值)。
现在要对把这n个音调分配给小Q或牛博士,让他们演唱的难度之和最小,请你算算最小的难度和是多少。
如样例所示: 小Q选择演唱{5, 6}难度为1, 牛博士选择演唱{1, 2, 1}难度为2,难度之和为3,这一个是最小难度和的方案了。

输入描述:
输入包括两行,第一行一个正整数n(1 ≤ n ≤ 2000) 第二行n个整数v[i](1 ≤ v[i] ≤ 10^6), 表示每个音调。
输出描述:
输出一个整数,表示小Q和牛博士演唱最小的难度和是多少。
输入例子1:
5
1 5 6 2 1
输出例子1:
3

这是一道动态规划的题目。

详细很多同学和我一样,一看到动态规划(Dynamic Programming)和拓扑图等名词就头疼,令人纠结的是很多大公司都会考动态规划的题目,好吧!静下心来去弄懂动态规划的算法原理。

动态规划的思想:

若该问题很复杂,我们考虑将问题分为几个小问题,而且这些小问题相互之间不存在相互调用,这就是动态规划的思想。

如下图有五个阶段,每个阶段有4种选择,求最短路径:

我们用暴力搜索方法去求解,共需要次运算,时间复杂度高达,如果面试利用暴力搜索方法去寻找最优问题,应该达不到所设置的运行时间。

我们用动态规划方法去求解,利用递归思想,先计算S1阶段的最短路径,然后保存该路径,利用递归的思想去求解S2,S3,....,S5,这种方法的时间复杂度。所以说动态规划大大的减小了运行时间。

一说到“递归”,我们想到了什么?没错,那就是递归表达式,动态规划算法称其为状态转移方程,思想是一样的。

若我们知道了状态转移方程,且知道初始状态值,那么我们就可以通过递归去求解算法最优问题,切记动态规划算法能够缩短运行时间的原因在于每次递归后保存了该状态的值。

下面我们用动态规划分析这道面试题:

假设dp[i][j]表示一个人选择第i个音调和另一个人选择第j个音调的最小难度,这里不特指小Q和牛博是的原因是这里的 i 永远大于 j。

i大于j共有两种情况:

1)i =j+1时,我们在完全题目的基础下,写下递归关系(即状态转移方程):

dp[i][j] = dp[i-1][k] + abs(arr[i] - arr[k])    其中 0<=k<i-1

 2)i>=j+1时,递归关系:

dp[i][j] = dp[i-1][j] +  abs(arr[i])-arr[i-1])

我们知道了状态转移方程,还需要设置初始值:

由题意可知,难度计算必须要有两个调才能计算。

因此初始值可设置:dp[0][0] = 0,dp[1][0] = 0;

当i = j+1时,dp[i][j]的递推表达式没考虑到一种特殊情况:当一个人是第一次谈第i个调时,之前的 (i-1)个调都是另一个人谈的,就有 dp[i][j] = abs(arr[1]-arr[0]) + abs(arr[2]-arr[1]) + ... + abs(arr[i-1]-arr[i-2])

根据上面的分析编码:

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main()
{
int len=0;

while(cin >> len)
{
vector<int> arr(len);
for(int i = 0;i < len;i++)
cin>>arr[i];

if(len<3)
cout<<"0"<<endl;
else
{
//vector<vector<int>> dp(len,len);
vector<vector<int>> dp(len,vector<int>(len));
vector<int> acc(len);

//dp[0][0] = 0 - abs(arr[1] - arr[0]);
dp[0][0] = 0;

for(int i = 1;i < len;i++)
{
acc[i] = acc[i-1] + abs(arr[i] - arr[i-1]);
dp[i][i-1] = acc[i-1];
for(int j = 0;j<i-1;j++){
dp[i][j] = dp[i-1][j] + acc[i] - acc[i-1];
dp[i][i-1] = min(dp[i][i-1],dp[i-1][j] + abs(arr[i]-arr[j]));
}
}

int min1 = 1e9;
for(int j =0;j<len-1;j++){
min1 = min(min1,dp[len-1][j]);
}
cout<<min1<<endl;
}

}
return 0;
}

代码和解题思路参考了网友buaaqlyj的回答:

https://www.nowcoder.com/test/question/done?tid=30725143&qid=126954#summary

欢迎扫码关注:

微软面试100题完整版(题目答案齐全) 微软面试100题完整版(题目答案齐全) 微软面试100题完整版(题目答案齐全) 微软面试100题完整版(题目答案齐全) 微软面试100题完整版(题目答案齐全) 立即下载

相关推荐

Creo报错代码-9?手把手教你重新生成许可证文件(基于Creo 10.0)

本文详细解析Creo报错代码-9的成因及解决方案,重点介绍如何重新生成许可证文件以应对网络环境变化导致的验证失败。通过分步指南和高级技巧,帮助用户有效管理多网络环境下的Creo许可证问题,提升工作效率。

weixin_30839881的博客 565

框架面试题二

89、阐述Struts 2中的Action如何编写?Action是否采用了单例?答:Struts2的Action有三种写法:①POJO②实现Action接口重写execute()方法③继承ActionSupport类一个请求对应一个Action实例,struts2是多例的90、Struts 2中的Action并没有直接收到用户的请求,那它为什么可以处理用户的请求,又凭什么知道一个请求到底交给哪个A...

伟大的程序员 483

【数字图像处理第四版课后习题答案】第2章 数字图像基础(含英文原版)

如图 P2.3 所示,视网膜图像中与点相对应的直径 x 是由类似的三角形得到的。即得出 x = 0.085d。根据第 2.1 节中的讨论,并结合一些自由解释,我们可以将眼窝视为一个方形传感器阵列,拥有大约 337,000 个元素,这相当于一个大约 580×580 个元素的阵列。假设元素间距相等,则在 1.5 毫米长的直线上有 580 个元素和 579 个空间,共计 1,159 个。换句话说,如果一个点的直径 d<1.3×10-6 m,或者 d<15.3×10 m,眼睛就无法检测到这个点。

weixin_56463218的博客 1万+

dynamic crm心得

我从事dynamic CRM 开发主要做了: 1.web资源 2.webapi 3.控制台 4.插件(外挂) dynamic 365 crm 代码实例: https://docs.microsoft.com/zh-cn/dynamics365/customer-engagement/developer/sample-code-directory 1.web资源: 自己开发完页面后...

weixin_39753381的博客 3332

无需Root!用VirtualXposed+JustTrustMe在安卓高版本上抓包拼多多API数据

本文详细介绍了在安卓高版本设备上无需Root权限即可抓取拼多多API数据的完整方案,通过VirtualXposed与JustTrustMe组合技术,有效绕过SSL Pinning限制。文章涵盖工具准备、环境配置、应用处理及实战分析,特别针对PDD应用的混合通信策略提供了专业解决方案,适合开发者进行竞品分析和数据采集。

weixin_28678151的博客 455

VisionMaster -Group循环、数组数据格式化

这里创建一个格式化工具,按照自己想要的模式格式化刚刚输出的数据。因为是检测多个物体,所以这里选择输出的是数组。第一次的模板很不满意,反复调整参数也没好,边缘不整齐,强迫症患者受不了。实测如果输入设置太多,会导致模块失效,所以尽量选择需要的少量参数。这里要打开循环使能,循环数值就是高精度匹配的匹配个数。Group输出设置里选择刚刚建立的数据集。左边是主流程,右边是组合模块内部流程。修改采图这里的曝光值,图像提亮一点。建一个数据集,把想要的数据收集起来。用TCP助手测试一下OK。成功得到了想要的数据。

weixin_69505365的博客 4532

crm问题

1.二级内容,参数如何传递。 2.打开二级页面的按钮,首先是根据角色授权,然后过滤数据是否本人可以操作。如果是核查角色,则判断是否是核查人本人,其他角色不判断人。 3.用户中字典回显,其他直接插入内容。目前先可以直接插入内容。 4.下拉框绑定表数据。可参考字典。数据源来自表数据的controller,而不是页面对应的controller.一个页面可以对应多个controller. ...

wenxi2367的博客 570

【Gin框架入门到精通系列01】Gin框架介绍与环境搭建

本文是Gin框架入门到精通系列的第一篇,系统介绍Gin框架的基本概念、核心特性以及环境搭建。无论你是Go语言新手还是有经验的开发者,都能通过本文快速掌握Gin框架的基础知识,创建并运行你的第一个Gin应用。

GopherTribe的博客 1560

CRM 面试题-有需要的朋友拿去

SAP CRM 7.0 Exam Practice Questions Version 1.4 – April 2011 Mensino Limited Copyright 2011 Mensino Limited, UnitedKingdom All rights reserved. Published 2011. Contact: info@mensino.com For more

Bruce_yin的专栏 6762

AUTOSAR进阶图解==>AUTOSAR_SWS_CANStateManager

AUTOSAR CAN状态管理器(CanSM)摘要 CanSM是AUTOSAR通信栈中的关键模块,负责管理CAN网络状态和模式转换。主要功能包括: 控制CAN控制器/收发器工作模式(STARTED/STOPPED,NORMAL/STANDBY) 处理三种网络状态(全通信、静默通信、无通信)之间的转换 监控和处理总线关闭(Bus-Off)事件 与ComM、CanIf、BswM等模块协同工作 CanSM通过状态机管理网络状态转换,支持可配置的总线关闭恢复策略。它为每个CAN网络维护独立的状态机,实现网络状态的精

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 5580

【RT-DETR多模态融合改进】| 自研 多模态大核选择模块:MM_LSK,适配多模态图像信息融合

本文记录的利用改进的多模态大核选择模块(MM-LSK)优化RT-DETR,构建可见光-红外双模态目标检测网络。在遥感等大尺寸图像的可见光-红外双模态小目标检测任务中,单模态检测易受光照、云雾、背景干扰等因素影响,且小目标外观信息匮乏,无法仅基于单模态外观实现较好的识别,因此需要融合双模态互补特性与广泛的跨模态上下文信息进行辅助。

Limiiiing的博客 382

网易历届笔试题(11)

题目描述 小Q是篮球训练队的教练,篮球队新加入了N名队员,第i名队员的篮球水平值为ai。 小Q现在要把他们按照以下的要求分为A队和B队进行训练: 1、A队的队员水平值之和严格大于B队的队员水平值之和 2、对于A队中的任意一名队员,如果把他分配到B队,A队的水平值之和就会严格小于B队的水平值之和。 3、每个队员必须要加入一个队伍 小Q现在想知道有多少种方案可以按照以上要求完成分队。 输入描述: 输入包括两行, 输入的第一行为一个正整数n(2 <= N <= 50), 表示队员的数量。 第二

信仰.的博客 618

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

动态规划 &&网易合唱团笔试

问题描述: 有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n 个学生中按照顺序选取 k 名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗? ...

W.J.Z 290

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

动态规划实战:Go与C++实现对比与性能优化解析

动态规划是解决最优化问题的核心算法范式,其原理基于将复杂问题分解为重叠子问题,并通过存储子问题的解来避免重复计算,从而提升效率。这一思想在算法设计与工程实践中具有重要价值,广泛应用于路径规划、资源分配、序列分析等场景。在具体实现时,编程语言的选择直接影响算法的性能表现和代码的可维护性。例如,Go语言以其简洁的语法和内置的并发支持,适合快速开发和维护;而C++则通过对内存布局的精细控制,如利用滚动数组优化空间复杂度,能够最大化缓存局部性,提升计算性能。本文以一道典型的二维动态规划问题为例,深入探讨了在Go和C

weixin_30352191的博客 333

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

微软认证(dynamic 365)考试

微软有很多认证考试,但是在国内基本没什么人考,可能是因为作用不大吧???公司让我去考,我就冲了,分享一下我的经历,包括如何准备,如何预约,考试过程。 1.如何准备 微软官网有个认证网站,选择想要的认证,里面会提供考试材料和报名入口。 认证网站 我以MB-901作为例子,点击相应的内容 从上一步进入到对应的认证,往下拉可以看到考试材料 2.如何预约 从上一步进入到对应的认证之后,往下拉可以看到预约(我以社会人为例子) 填好个人信息之后,点击继续 后面根据提醒一步步预约成功 3.考试过程 材料准备:手机、

jingtiaoyang6666的博客 1万+

Dynamics 365运维疑难问题处理思路 三

ERP中不稳定再现问题解决思路

Chris_Bu的博客 667

Dynamics 365 实施常见问题及避免

项目管理中,解决问题的方法没有对错,只有是否适合自己,以下经验仅仅是个人的观点,分享出来是为了跟同行进行交流,给初学者在项目实施过程中一些参考案例及思路。 经历过ERP的实施后发现,大部分的项目实施都很辛苦,尤其上线前后,顾问们都加班加点的干活,但是上线后仍然发现有很多问题,我见过和听过的问题主要有以下几类。 1. 性能问题 2. 主数据问题 3. 业务流程问题 4. 操作问题 5. 功能Bug 或多或少问题都可以归结到上述几类中,性能问题: 这一类在各个项目中经常遇...

Chris_Bu的博客 2095

【转】Dynamics 365 CRM 开发架构简介

目录 概览 名词解释 连接到Dynamics 365 CRM Web API Organization service 选择 - Web API vs. Organization service 扩展服务端 扩展应用端 正文 Dynamics 365 CRM提供了多种编程模型,你可以灵活地按需选用最佳模式。 本文是对Dynamics 365 CRM编程模型的综述。 回到顶部 概览 下图表明了Dynamics 365 CRM的主要可编程场景。请根据整体解决方案选择.

sinolover的专栏 1792

Dynamics 365 F&O 性能问题实例二

Dynamics 365 性能案例之受害者场景举例

Chris_Bu的博客 624

106@365大型互联网企业面试题整理&…

全新整理:微软、谷歌、百度等公司经典面试 100 题[第 101-170 题] 整理:July、二零一一年三月九日。 应网友承诺与要求,全新整理。转载,请注明出处。 博主说明: 此 100 题 V0.2 版,本人不再保证,还会提供答案。 因为之前整理的微软 100 题,已经基本上,把题目都出尽了。见谅。 --------------------------------------------微软十

IT小生 2057

⭐️动态规划(Dynamic programming)详解

动态规划(Dynamic Programming,简称DP)是一种广泛应用于数学、计算机科学和经济学等领域的方法论。其核心思想是通过将复杂问题分解为相对简单的子问题,并存储子问题的解以避免冗余计算,从而显著提高计算效率。动态规划作为运筹学的一个分支,专注于解决决策过程的最优化问题。20世纪50年代初,美国数学家贝尔曼(R. Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,并基于此创立了动态规划。

Python老吕的博客 6300

算法数据结构——动态规划算法(Dynamic Programming)超详细总结加应用案例讲解

动态规划(Dynamic Programming):简称DP,是一种求解多阶段决策过程最优化问题的方法。在动态规划中,通过把原问题分解为相对简单的子问题,先求解子问题,再由子问题的解而得到原问题的解。动态规划最早由理查德 · 贝尔曼于 1957 年在其著作「动态规划(Dynamic Programming)」一书中提出。这里的 Programming 并不是编程的意思,而是指一种「表格处理方法」,即将每一步计算的结果存储在表格中,供随后的计算查询使用。

白话机器学习 1万+

【算法】动态规划(Dynamic Programming)

文章目录什么是动态规划算法数字三角形经典递归解法 什么是动态规划算法 总体思想 (1)动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题 (2)经分解得到的子问题往往不是互相独立的,有些子问题被重复计算多次 (3)如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法(备忘录法) (4)图解: 使用动态规划来求解的问题需要具备的基本要素包括: (1)重复子问题 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子

高朗的博客 4万+

动态规划 Dynamic programming

文章目录一、前言二、优点三、引申1. [coin-change](https://leetcode.com/problems/coin-change/solution/) 换零钱问题2. [Minimum Path Sum](https://leetcode.com/problems/minimum-path-sum/) 最小路径问题3. [Partition Equal Subset Sum](https://leetcode.com/problems/partition-equal-subset-sum

Jeff_的博客 2083
上一篇: 10个必会的 PyCharm 技巧
下一篇: Python 69个内置函数分8类总结,这样记更方便!
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值