【常见笔试面试算法题12】动态规划算法案例分析

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

文章目录

    • 1、暴力搜索方法
    • 2、记忆搜索方法
    • 3、动态规划方法
    • 4、各种动态规划方法案例总结:

给定数组arr,arr中所有数都为正数,且不重复,每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个正整数aim代表要找的钱数,求换钱有多少种方法?

这道题可以用暴力搜索,记忆搜索,动态规划,状态继续化简后的动态规划方法等四种方法!
在面试中出现类似的题目,优化轨迹高度类似!

1、暴力搜索方法

下面先看这道题的暴力搜索方法的过程:
这里写图片描述
我们认为使用0张5元,让剩下的货币值arr[10,25,1],去组成剩下的钱的过程是一个递归的过程。
同理使用1张5元。2张5元…都会有一个递归的过程!

定义一个递归数组:int p1(arr,index,aim),它的意思是如果用arr[index…N-1]这些面值的钱组成aim,返回总的方法数!!!

public int coins1(int[] arr,int aim)
{if(arr==null||arr.length==0||aim<0)return 0;return process1(arr,0,aim);
}
public int process1(int[] arr,int index,int aim)
{int res =0;if(index==arr.length)res = aim==0?1:0;else{for(int i=0;arr[index]*i<=aim;i++)  //类似于0张5元到200张5元循环组成aimres += process1(arr,index+1,aim-arr[index]*i);}return res;
}
如果已经使用05元和110元的情况下,后续还需要求p1(arr,2,990)
2:表示剩下钱为arr[2,3]即为arr{25,1}
990:表示要找的剩余的钱数当使用25元和010元的情况下,后续还是要求p1(arr,2,990)
这样的重复计算,在暴力搜索中,是非常多的,这会导致暴力搜索的时间复杂度非常高!!!

2、记忆搜索方法

暴力搜索之所以效率低,是因为每次计算后都没有把计算所得结果保存起来,下次递归后还是要重新计算。

而且我们发现在暴力搜索方法中有以下现象:
arr使用不便,index和aim始终在变化。可以让p(index,aim)来代替递归过程
这里写图片描述

还需要新加一个二维数组用于保存每一次递归的结果!
这里写图片描述
代码如下:

public int coins2(int[] arr,int aim)
{if(arr==null||arr.length==0||aim<0)return 0;int[][] map = new int[arr.length][aim+1];return process2(arr,0,aim,map);
}
public int process2(int[] arr,int index,int aim,int[][] map)
{int res =0;if(index==arr.length)res = aim==0?1:0;else{int mapValue = 0;for(int i=0;arr[index]*i<=aim;i++)  //类似于0张5元到200张5元循环组成aim{mapValue = map[index+1][aim-arr[index]*i];if(mapValue!=0)res += mapValue==-1?0:mapValue;elseres += process2(arr,index+1,aim-arr[index]*i,map);}}map[index][aim]=res==0?-1:res;return res;
}

3、动态规划方法

这里写图片描述

如上图所示,dp[i][j] 表示使用arr[0…i] 货币的情况下,组成钱数j有多少种方法。上图第一列为1代表钱数为0,每一种货币都可以组成0(0乘以任意面值的货币)。
需要一行一行的计算,从上到下,从左到右,从子问题,到整个问题,最终最右下角的值,也就是dp[N-1][aim]就是我们要求的值:
这里写图片描述

要求dp[i][j],需要枚举它上一行左边的所有值(dp[i-1][1~j])

记忆搜索与动态规划的联系:
这里写图片描述

那么什么是动态规划呢?
这里写图片描述

动态规划方法的转化过程:
这里写图片描述

动态规划过程的关键点:
这里写图片描述

面试题:
有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法。

给定数组penny及它的大小(小于等于50),同时给定一个整数aim,请返回有多少种方法可以凑成aim。

测试样例:
[1,2,4],3,3
返回:2

class Exchange {
public:int countWays(vector<int> penny, int n, int aim) {// write code hereint dp[n][aim+1];//矩阵初始化for(int i=0;i<n;i++){for(int j=0;j<aim+1;j++){dp[i][j]=0;}}//初始化第一行数值for(int j=0;j<aim+1;j++){if(j%penny[0]==0)dp[0][j]=1;}//初始化第一列数值for(int i=0;i<n;i++){dp[i][0]=1;}//求其他行数值for(int i=1;i<n;i++){for(int j=1;j<aim+1;j++){                  for(int k=0;(j-k*penny[i])>=0;k++) {//根据上面分析的公式dp[i][j] += dp[i-1][j-k*penny[i]];}                                 }}return dp[n-1][aim];} 
};

4、各种动态规划方法案例总结:

我们上述所讲的动态规划方法其实是还可以经过优化的!!!

下面先来卡一个例子:
案例1
给定一个矩阵m,从左上角开始,每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有的路径中,最小的路径和,如果给定的路径如下图,则最小的路径和应该为1,3,1,0,6,1,0这条路径,返回最小值为:12
这里写图片描述

假设矩阵m的大小为M*N,行数为M,列数为N,生成大小和m一样的矩阵dp,行数为M,列数为N,dp[i][j]的值等于从左上角,也就是(0,0)
走到(i,j)位置的最小路径和。
这里写图片描述

那么除了第一行和第一列的值,其他部分的值为(只能是从上面过来,或者从左边过来):
这里写图片描述

那么我们就可以先从左到右先计算每一行的值,然后从上到下计算每一列的值,最后最右下角的值,就是我们要返回的值了:
这里写图片描述

案例2
这里写图片描述

动态规划的思路如下:
这里写图片描述

案例3:
这里写图片描述

这里写图片描述
则我们可以选择上述三种情况下最大的值作为返回值。

案例4:
这里写图片描述
解决方法:
这里写图片描述

案例5:
这里写图片描述
这里写图片描述

那么矩阵最右下角的值就是我们需要返回的值!!!

下一篇文章,将针对上述几个案例的具体算法题,进行编程验证!!!

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

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

相关文章

CSS命名规范(建议版)(转)

容 器&#xff1a;container/box 头 部&#xff1a;header 主 导 航&#xff1a;mainNav 子 导 航&#xff1a;subNav 顶 导 航&#xff1a;topNav 网站标志&#xff1a;logo 大 广 告&#xff1a;banner 页面中部&#xff1a;mainBody 底 部&#xff1a;footer 菜 …

kafka 思维导图

最近在培训沟通力过程中&#xff0c;一句话说的特别好&#xff0c;有输入就要有输出&#xff0c;最近又学习了一遍kafka 给大家分享一下

【C++深度剖析教程28】C++对象模型分析

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录学习的内容是&#xff1a;C对象模型分析&#xff01;&#xff01;&#xff01; 本质分析&#xff1a; class是一种特殊的struct 在内存中cl…

.Net Excel 部分操作

range.NumberFormatLocal ""; //设置单元格格式为文本 range (Range)worksheet.get_Range("A1", "E1"); //获取Excel多个单元格区域&#xff1a;本例做为Excel表头 range.Merge(0); //单元格合并动作 worksheet.Cells[1, 1] &…

【C++深度剖析教程29】C++对象模型分析下

加qq1126137994&#xff0c;微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 今天来继续学习C对象模型&#xff01; 在C编译器内部&#xff0c;类可以理解为结构体子类是由父类成员叠加子类新成员得到的 下面来写一个程序分析C的继承…

java 思维导图

最近有时间&#xff0c;又整理了一下java 思维导图&#xff0c;持续优化中 子模块拆分总结&#xff1a;java基础 java思维导图 总结

ASP.NET页面揭秘之页面生命周期【转】

首先简单介绍下Page类。 在.NET Framework中&#xff0c;Page类提供了ASP.NET应用程序从.aspx文件开始创建的所有对象的基本行为。Page类在System.Web.UI命名空间中定义&#xff0c;它派生于TemplateControl类并实现了IHttpHandler接口。TemplateControl类是一个抽象类&#xf…

【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 以下问题&#xff0c;都可以用非动态规划的方法做&#xff0c;我为了整理动态规划的方法思路&#xff0c;就全部用动态规划的思路来解决问题&#xff0c;这样还可以简化问题的处理&#xff0c;是时间复杂…

linux 思维导图

工作中使用总结的linux 分享一下

ADO.NET 3.5 Cookbook:一、连接数据(1)保存连接字符串

问题 转载于:https://www.cnblogs.com/PocketZ/archive/2010/04/27/1722555.html

【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 有一个矩阵map&#xff0c;它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;返回所有的…

mysql数据库思维导图

先前总结的一下数据库的思维导图&#xff0c;和大家分享一下&#xff0c;持续更新&#xff1b; 最近面试数据仓库工程师&#xff0c;过程中&#xff0c;问到索引类型&#xff0c;只是记得&#xff0c;普通索引&#xff0c;唯一索引&#xff0c;还有主键&#xff0c;面试中让说…

【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 这是一个经典的LIS(即最长上升子序列)问题&#xff0c;请设计一个尽量优的解法求出序列的最长上升子序列的长度。 给定一个序列arr及它的长度n(长度小…

数据思维

最近听的一本书&#xff0c;《数据思维》&#xff1a;分享一下 1.【数据定义】 能被电子化的叫做数据&#xff0c;滴滴司机数据化&#xff0c;ofo数据化&#xff0c;堵车数据化&#xff0c;太形象了&#xff0c;数据以后会是电&#xff1b; 注意&#xff01;数据与自己业…

【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 给定两个字符串A和B&#xff0c;返回两个字符串的最长公共子序列的长度。例如&#xff0c;A"1A2C3D4B56”&#xff0c;B"B1D23CA45B6A”&am…

MSMQ(MicroSoft Message Queue,微软消息队列)

MSMQ(MicroSoft Message Queue&#xff0c;微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式&#xff0c;相互通信的应用可以分布于同一台机器上&#xff0c;也可以分布于相连的网络空间中的任一位置。它的实现原理是&#xff1a;消息的发送者把自己想要发送…

hive 思维导图

1.整理了word文档&#xff0c;但是感觉没有思维导图清晰 &#xff0c;持续更新中 ​ hive 工作中分享。

【常见笔试面试算法题12续集五】动态规划算法案例分析5 01背包练习题

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 一个背包有一定的承重cap&#xff0c;有N件物品&#xff0c;每件都有自己的价值&#xff0c;记录在数组v中&#xff0c;也都有自己的重量&#xff0c;…

结构思考力思维导图

个人提升&#xff0c;喜欢钻研的同时&#xff0c;需要增加一下&#xff0c;其他方面的知识&#xff0c;分享一下&#xff1a;

我的JavaScript for Visual Studio插件开源了

最近忙于别的事情&#xff0c;我的JavaScript for Visual Studio插件一直没有做什么更新了很是对不起大家。不过觉得这个东西如果做好的话对大家还是有帮助的&#xff0c;所以我还是把代码share出来&#xff0c;这样大家可以一起来扩展&#xff0c;人多力量大嘛我希望大家一起来…