/**
动态规划专题:这是最简单的并且已经给出了转移方程,平时我们用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. 不同的二叉搜索树相关推荐

  1. 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

    学习内容 力扣算法 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 具体内容 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 ...

  2. LeetCode-动态规划基础题-509. 斐波那契数

    描述 题目如下: 509. 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0 ...

  3. D38| DP理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

    DP理论基础 重要知识点: 1.动规和贪心的区别:动规是由前一个状态推导出来的,而贪心是局部直接选最优的 2.动规五部曲: 1)确定dp数组(dp table)以及下标的含义 2)确定递推公式 3)d ...

  4. 【快乐水题】509. 斐波那契数

    原题: 力扣链接:509. 斐波那契数 题目简述: 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F( ...

  5. 代码随想录算法训练营第三十八天 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯。

    Leetcode 509. 斐波那契数 题目链接:509. 斐波那契数 class Solution {public:int fib(int n) {if(n <= 1)return n;int ...

  6. 整数拆分、不同的二叉搜索树-代码随想录

    343. 整数拆分 力扣题目链接(opens new window) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 ...

  7. leetcode 509. 斐波那契数

    方法一:递归 使用递归计算给定整数的斐波那契数. 效率最差但是最简单的方法,会重复计算,就不实现了. 方法二:记忆化自底向上的方法 方法三:自底向上进行迭代 方法四:矩阵求幂 public class ...

  8. leetcode系列-509.斐波那契数

    题目描述:斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 . 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是:F(0) = 0,F(1) = 1 F(n) ...

  9. [leetcode]509. 斐波那契数

    斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,F(1) = 1 F(n) = F(n ...

最新文章

  1. 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...
  2. 关于简单动态规划(Dynamic Programming)的总结
  3. 统计学习II.7 广义线性模型1 指数分布族
  4. 基因分子生物学(2)-DNA携带遗传特性
  5. Docker端口映射实现
  6. 漫步数理统计十一——连续随机变量(下)
  7. jsf2.0---jsf的新特性
  8. TCMalloc原理
  9. yapi 权限_YApi内部部署文档
  10. npm创建Vue工程【element UI】
  11. 关于步进电机励相数、拍数、励磁方式、编码
  12. 【论文阅读笔记】Autoencoder as Assistant Supervisor
  13. 百度权重怎么查询?哪里可以查询百度权重?
  14. Android 使用FFmpeg3.3.9基于命令实现视频压缩
  15. 利用STM32F103的DAC结合xtr111实现4-25mA输出的数据分析
  16. 【数字测图原理与方法】第三章水准测量原理和仪器
  17. Hadoop-IPC模型
  18. excel2010设置列宽为像素_使用像素单位设置 EXCEL 列宽或行高
  19. 服务器10TB硬盘如何分区合理,机械硬盘有必要分区吗_机械硬盘分区有没有必要的图文教程...
  20. 3.7 wyh的物品(01分数规划,二分)

热门文章

  1. 一般线性规划求最大值
  2. 修改脚本、WSH 让系统不被恶意代码篡改
  3. perf trace跟踪系统调用
  4. CSAPP实验四:性能优化实验(Perflab)
  5. 处理7z格式的001 002 文件
  6. JAVA CRC-CCITT (Kermit)!!内网仅此一份
  7. 【剑指 Offe】剑指 Offer 11. 旋转数组的最小数字
  8. 微带线和带状线的SIEMC分析以及对DDR等长设置的影响
  9. 公司企业邮箱账号格式怎么填?
  10. opencv cvhog详解