【力扣动态规划基础专题】:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62. 不同路径 63. 不同路径 II 343. 整数拆分 96. 不同的二叉搜索树
/**
动态规划专题:这是最简单的并且已经给出了转移方程,平时我们用dp[]数组来表示转移方程转移方程: dp[n] = dp[n-1]+dp[n-2]初始值:dp[0] = 0 , dp[1] = 1*/
class Solution {public int fib(int n) {if(n ==0)return 0;int[] dp = new int[n+1];dp[0] = 0;dp[1] = 1;for(int i=2 ; i<=n ; i++){dp[i] = dp[i-1] + dp[i-2]; }return dp[n];}
}
/**
上题的空间复杂度太高了,因此我们可以换一种写法,不需要dp,其实下面这种写法有点像递归,但是时间复杂度下来了,并且递归用的数据结构是"栈"*/class Solution {public int fib(int n) {if(n<2){return n;}return fib(n-1)+fib(n-2);}
}
/**
动态规划:一次可以爬1~2个台阶:因此转移方程:dp[n] = dp[n-1] + dp[n-2] ,初始值 dp[0] =1 , dp[1] =1 , 对于dp[0]其实我们不知道登于0还是1,但是我们可以通过dp[2]去递推,dp[2]应该等于2,因此dp[0]应该等于1*/
class Solution {public int climbStairs(int n) {if(n < 2)return 1;int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;for(int i=2 ; i<=n ; i++){dp[i] = dp[i-2] + dp[i-1];}return dp[n];}
}
/**
动态思想:该题基础也是爬楼梯问题,只不过我们要记录的是花费的值:转移方程:dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2])、初始值:dp[0] = 0 , dp[1] = 0 , dp[2] = Math.min(dp[0]+cost[0] ,dp[1]+cost[1])*/
class Solution {public int minCostClimbingStairs(int[] cost) {//cost范围已经给出>=2,因此不用进行判别<2的情况int len = cost.length;int[] dp = new int[len+1];dp[0] =0;dp[1] =0;for(int i=2 ; i<=len ; i++){dp[i] = Math.min(dp[i-2]+cost[i-2] , dp[i-1]+cost[i-1]);}return dp[len];}
}
dsadas
/**
动态规划:其实我们发现对于动态规划,就是求什么就设什么,因为这是一个网格,因此dp[m][n]表示一个网格,并且因只能向下或向右移动,因此:转移方程 :dp[m][n] = dp[m][n-1] + dp[m-1][n];初始值:因为是二维,所以初始值是两个边 dp[i][0] , dp[0][j] dp[i][0]1 , dp[0][j] = 1 , dp[0][0] =1;*/
class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//初始值dp[0][0] = 1;for(int i=1 ; i<m ; i++){dp[i][0] = 1;}for(int j=1 ; 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];}
}// 我们求表达式,从初始点到结尾一共要走移动m+n-2次,我们要在其中m-1次向下
// 也就是一共(m+n-2)!/[(m-1)!*(n-1)!]=(m+n-2)*(m+n-3)*...*n/(m-1)! 不推荐
// class Solution {// public int uniquePaths(int m, int n) {// long res = 1;
// for(int x=1 , y=n ; x<m ; x++,y++){ //注意用long ,要不然可能溢出
// res = res*y/x; //这里还不能写成 res*(y/x),因此可能除不开
// }
// return (int)res;
// }
// }
ssdadsad
/**
动态规划:相对于 “不同路径” 这道题 , 该题添加了额外的障碍物, 用"1"表示思考:因为只能向下或者向右走,因此我们需要注意的是障碍物的下面和右边一个格:转移方程依旧要分情况:对于dp[m][n]1、obstacleGrid[m][n] == 0 , 则 dp[m][n] = 02、obstacleGrid[m][n] ≠ 0 , 则dp[m][n] = dp[m-1][n] + dp[m][n-1];*/
class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];//初始值for(int i=0 ; i<m ; i++){if(obstacleGrid[i][0] == 1)break;elsedp[i][0] = 1; //说明遇到障碍了,则后面为0}for(int j=0 ; j<n ; j++){ //必须j==0开始,避免障碍物在开头,那样如果j==1开始,则dp[0][j] =1会错误if(obstacleGrid[0][j] == 1) break;else dp[0][j] = 1;}//写转移方程for(int i=1 ; i<m ; i++){for(int j=1; j<n ; j++){if(obstacleGrid[i][j] == 1)dp[i][j] = 0;elsedp[i][j] = dp[i-1][j] + dp[i][j-1];}}return dp[m-1][n-1];}
}
/**
解题思想:这道题我没有想到用动态规划,一开始没什么思路,注意 2<=n<=58动态规划:求什么设什么 dp[n]表示为可以获得的最大值 ,n开始分成不同值得和,因此我们可以遍历数组,转移方程直接写*/
class Solution {public int integerBreak(int n) {int[] dp = new int[n+1];//初始值dp[0] = 0;dp[1] = 0;for(int i=2 ; i<=n ; i++){//对dp[i]分成不同得值得和,求其最大乘积for(int j=1 ; j<i ; j++){dp[i] = Math.max(j*dp[i-j],Math.max(j*(i-j), dp[i]));}}return dp[n];}
}
//动态规划:动态规划的思想就是解决一个一个的小问题,然后合成一个大问题,因此比如给定一个有序序列1~n,我们可以i(2~n)为树根,将1~(i-1)序列作为左子树,将(i+1)~n作为右子树。接着我们可以按照同样的方式递归构建左子树和右子树。
//说到动态规划:两个步骤:1、边界条件 2、转移方程
//定义两个函数:G(n),长度为n的序列能构成的不同二叉搜索树的个数,且G(0)=1,G(1)=1
//F(i.n):以i为根,序列长度为n的不同二叉树搜索个数(1<=i<=n) G(n) = F(i,n)的累加和,i为1~n,F(i,n) = G[i-1]*G[n-i]
class Solution {public int numTrees(int n) {int[] dp = new int[n+1];//边界条件dp[0] = 1;dp[1] = 1;//n为2及以上的二叉搜索树的个数for(int i=2 ; i<=n ; i++){//我们以j为根节点,for(int j=0 ; j<i ; j++){dp[i] += dp[j]*dp[i-1-j];}}return dp[n];}
}
【力扣动态规划基础专题】:509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 62. 不同路径 63. 不同路径 II 343. 整数拆分 96. 不同的二叉搜索树相关推荐
- 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
学习内容 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 具体内容 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 ...
- LeetCode-动态规划基础题-509. 斐波那契数
描述 题目如下: 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0 ...
- D38| DP理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
DP理论基础 重要知识点: 1.动规和贪心的区别:动规是由前一个状态推导出来的,而贪心是局部直接选最优的 2.动规五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)d ...
- 【快乐水题】509. 斐波那契数
原题: 力扣链接:509. 斐波那契数 题目简述: 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F( ...
- 代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。
Leetcode 509. 斐波那契数 题目链接:509. 斐波那契数 class Solution {public:int fib(int n) {if(n <= 1)return n;int ...
- 整数拆分、不同的二叉搜索树-代码随想录
343. 整数拆分 力扣题目链接(opens new window) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 ...
- leetcode 509. 斐波那契数
方法一:递归 使用递归计算给定整数的斐波那契数. 效率最差但是最简单的方法,会重复计算,就不实现了. 方法二:记忆化自底向上的方法 方法三:自底向上进行迭代 方法四:矩阵求幂 public class ...
- leetcode系列-509.斐波那契数
题目描述:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 . 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是:F(0) = 0,F(1) = 1 F(n) ...
- [leetcode]509. 斐波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) = F(n ...
最新文章
- 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...
- 关于简单动态规划(Dynamic Programming)的总结
- 统计学习II.7 广义线性模型1 指数分布族
- 基因分子生物学(2)-DNA携带遗传特性
- Docker端口映射实现
- 漫步数理统计十一——连续随机变量(下)
- jsf2.0---jsf的新特性
- TCMalloc原理
- yapi 权限_YApi内部部署文档
- npm创建Vue工程【element UI】
- 关于步进电机励相数、拍数、励磁方式、编码
- 【论文阅读笔记】Autoencoder as Assistant Supervisor
- 百度权重怎么查询?哪里可以查询百度权重?
- Android 使用FFmpeg3.3.9基于命令实现视频压缩
- 利用STM32F103的DAC结合xtr111实现4-25mA输出的数据分析
- 【数字测图原理与方法】第三章水准测量原理和仪器
- Hadoop-IPC模型
- excel2010设置列宽为像素_使用像素单位设置 EXCEL 列宽或行高
- 服务器10TB硬盘如何分区合理,机械硬盘有必要分区吗_机械硬盘分区有没有必要的图文教程...
- 3.7 wyh的物品(01分数规划,二分)