1.什么是动态规划

存在最优子程序,跟分治最大区别就是存在很多相同的子问题,如果用递归就会存在相同的值算了很多次。所以可以用数组的形式将已经计算出来并且后面又需要用得到的保存在数组中。
一般求最值(最大/最小)、求总值、存在性问题

2.基本步骤

以最少零钱兑换题目为例:注意,存在无法找零钱(2、5、7)的情况,此时返回-1即可。但是在写程序的时候就要注意了,可将无法找够零钱的值设置为无穷大。
(1)确定状态,一维还是二维,首先由最后一步分析状态:最后一枚硬币可以是2、5、7,所以最少硬币会在这三种情况里面出现。dp[i]表示要找i元零钱时所找的最少的硬币数。
(2)确定子问题,状态转移函数:dp[i]=min(dp[i-coins[j]]+1),j取coins的大小-1,在这里需要具体问题具体分析,但是整体思路不变。
(3)确定初始值,dp[0]=0,表示要找0元钱的时候硬币最少为0。
(4)确定计算顺序,一般是根据状态转移函数中的右边的值需要先计算得出。

最后还有一些细节方面的问题,需要根据题目来进行完善!

public static int minCountCoins(int money,int []coins){//只有2/5/7三种价值的硬币,如果无法找零钱,那就返回-1。//在这里无法找零钱的都设置为无穷大=Integer.MAX_VALUE;int dp[]=new int[money+1];//找零为0元时,硬币数为0,设置初值dp[0]=0;//状态转移方程为:dp[i]=min(dp[i-1]+1,dp[i-2]+1,dp[i-5]+1);for(int i=1;i<=money;i++){dp[i]=Integer.MAX_VALUE;for(int j=0;j<coins.length;j++){if(i>=coins[j]&&dp[i-coins[j]]<Integer.MAX_VALUE)dp[i]=Math.min(dp[i],dp[i-coins[j]]+1);}}if(dp[money]==Integer.MAX_VALUE){return -1;}else{return dp[money];}}

3.题型:

(1)求总路径数目问题:

路径总和求解:
1、一个M*N的矩阵,即可看作是棋盘,然后求从左上角到右下角(只能向下、向右走)全部路径数目。
2、二维的:所以状态dp[i][j]表示从左上角(0,0)到(i,j)位置的所有的路径数目。
3、最优子问题:dp[i][j]=dp[i-1][j]+dp[i][j-1]
//初始值:dp[0][j]=dp[i][0]=1,因为只有一条路径。
//计算顺序,由上到下、由左向右。

    public static int SumPath(int M,int N){int [][]dp=new int[M][N];for(int i=0;i<M;i++){dp[i][0]=1;}for(int j=0;j<N;j++){dp[0][j]=1;}for(int i=1;i<M;i++){for(int j=1;j<N;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[M-1][N-1];}

(2)判断存在性问题:青蛙跳砖问题

1、青蛙跳转问题,青蛙从0号砖出发,每次最多可跳cost[i]块砖,求能不能到达第N块砖。
2、状态:dp[i]表示能不能到到达第i块砖。
3、子问题:能不能到达第j块砖即dp[j]=true,且cost[j]>=i-j。
4、状态转移这里就涉及到了两次循环,每次求的时候j都要从最近的开始进行遍历,找到就退出。
5、求解方向:从小到大。

public static boolean judgeExist(int N,int[] cost){boolean dp[]=new boolean[N];dp[0]=true;for(int i=1;i<N;i++){dp[i]=false;for(int j=i-1;j>=0;j--){if(dp[j]&&(cost[j]>=(i-j))) {dp[i] = true;break;}}}return dp[N-1];}

(3)作业:乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

在这里其实是动态规划,但是需要非常注意,最开始想的状态也没毛病,dp[i]表示最后包含nums[i]的子数组的最大乘积,但是有一点有问题,那就是真的能从dp[i-1]直接推出dp[i]吗?因为存在负数,所以会存在翻转现象,即本来这样是负的,所以会被抛弃,但是由于下一个是负的会导致对于下一个来说这样的乘积更大

举个例子:[-2,3,-4]
dpmax[0]=-2;
dpmax[1]=3;
dpmax[2]=-4!!!,是错的!!!,dpmax[2]=24;
所以考虑到翻转的问题,我们需要同时维护dpmin这个数组去记录最小值,以便于考虑其翻转的情形。
class Solution {public int maxProduct(int[] nums) {int[] dpmax=new int[nums.length];int[] dpmin=new int[nums.length];dpmax[0]=nums[0];dpmin[0]=nums[0];int max=nums[0];for(int i=1;i<nums.length;i++){dpmax[i]=Math.max(Math.max(dpmin[i-1]*nums[i],dpmax[i-1]*nums[i]),nums[i]);dpmin[i]=Math.min(Math.min(dpmin[i-1]*nums[i],dpmax[i-1]*nums[i]),nums[i]);max=Math.max(max,dpmax[i]);}return max;}
}

动态规划(九章算法)详细学习相关推荐

  1. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  2. 动态规划法求最大字段和时间复杂度_九章算法 | 动态规划:最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度. 在线评测地址:LintCode 领扣 说明 最长上升子序列的定义: 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低 ...

  3. 分治习题--九章算法培训课第三章笔记

    1.Maximum Depth of Binary Tree 这是道简单的分治习题了 分: 左子树最大深度 右子树最大深度 治: 最大深度等于max(左子树,右子树)+1 public class S ...

  4. 九章算法笔记 - 思路总结

    上九章算法课的笔记,之前记在笔记本上,现在扫描出来便于保存,每次面试之前看着这个笔记过一遍,心里有谱一些. 目录: 1.二分搜索 Binary search 2.二叉树与分治法 3.宽度优先搜索 BF ...

  5. 【九章算法】北美求职之面试题目

    九章算法面试题55 旋转字符串 给一个字符串和一个旋转的偏移量offset,将字符串循环右移offset位.如:"abcdefg" ... Tags: 字符串 九章算法面试题54 ...

  6. 九章算法-面试题总结(算法、强化算法、系统设计高清视频观看)

    1 落单的数 题目描述: 有2n+1个数,其中2n个数两两成对,1个数落单,找出这个数.要求O(n)的时间复杂度,O(1)的空间复杂度. 进阶问题:如果有2n+2个数,其中有2个数落单,该怎么办? 分 ...

  7. 九章算法【总结】Java 搞定链表-面试常考题目精选

    面试大总结之链表 CS3K.com 一.OverView: 链表是面试中常考的,本文参考了其它一些文章,加上小编的自己总结,基本每个算法都测试并优化过. 算法大全(1)单链表 中还有一些链表题目,将来 ...

  8. 编号是i的结点所在的层次号是_九章算法 | 微软面试题:二叉树的锯齿形层次遍历...

    给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 在线评测地址:LintCode 领扣 样例 1: 输入:{1,2,3} 输出:[[1],[3,2]] ...

  9. 多个数字数组_九章算法 | 谷歌面试题:多个数组的交集

    给出多个数组,求它们的交集.输出他们交集的大小. 在线评测地址:LintCode 领扣 样例 1: 输入: [[1,2,3],[3,4,5],[3,9,10]]输出: 1解释:只有3出现在三个数组中. ...

  10. arrays合并两个数组_九章算法 | 字节跳动面试题:合并k个排序数组

    将 k 个有序数组合并为一个大的有序数组. 在线评测地址:LintCode 领扣 样例 1: Input: [[1, 3, 5, 7],[2, 4, 6],[0, 8, 9, 10, 11]] Out ...

最新文章

  1. 【完美解决】Could not process result for mapping: ResultMapping{property=‘null‘, column=‘xxx‘, javaType=
  2. 相亲有风险,且行且珍惜!| 今日最佳
  3. 0xFFFFFF的问题
  4. c51编程语言基础习题,《单片机基础》练习题及答案
  5. 如何查看本机安装的python支持哪种.whl文件
  6. linux系统时间和硬件时间的修改,Linux修改日期、时间,系统与硬件时间
  7. 【自动驾驶】武汉全球首发自动驾驶商用牌照,无人驾驶的梦想照进现实?
  8. 解决Maven的Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  9. 【Solidity】1.一个Solidity源文件的布局 - 深入理解Solidity 1
  10. 从时分复用、频分复用到码分复用(CDMA)
  11. OpenCV版本与EmguCV版本匹配问题
  12. Qt 环境下MAPX组件的编程
  13. 进制转化(北理乐学编程题目)
  14. crackme 004
  15. 前沿分享|上海市新能源汽车数据平台 王成名: 车联网全景监控数据时空超融合数据库方案
  16. 我教你写Makefile,你给我介绍Girlfriends.
  17. 微信公众号发红包 php,php微信公众号接口实现发红包的方法
  18. hihoCoder #1498 : Diligent Robots【数学】
  19. 疫情推动“宅经济”成为当前重要经济发展模式
  20. 你了解HTTP2协议吗?(二)

热门文章

  1. 关于python-scrapy框架爬取微博转发的信息
  2. mongoDB数据建模
  3. Linux(Ubuntu)通过NFS服务挂载群晖NAS为虚拟磁盘
  4. 【网站搭建】腾讯云域名服务器购买域名解析及宝塔安装
  5. SIT-board 远程交互式白板的实现
  6. 刘强东给村民送500万年货;支付宝或上线黄金红包;Space X成功发射重型火箭丨价值早报
  7. LTE下行物理层传输机制(1)-天线端口Antenna Port和小区特定参考信号CRS
  8. 如何打印字符串指针的地址?
  9. JavaScript:演示Ajax的get和post请求,练习选顶卡和换肤案例
  10. C语言中数组作为函数的形参