济宁北湖建设局网站如何用wordpress搭建个人博客

当前位置: 首页 > news >正文

济宁北湖建设局网站,如何用wordpress搭建个人博客,天津专业网站建设公司,网站建设服务费账务处理动态规划#xff0c;英文#xff1a;Dynamic Programming#xff0c;简称DP#xff0c;如果某一问题有很多重叠子问题#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题#xff0c;五步走#xff1a;状态定义英文Dynamic Programming简称DP如果某一问题有很多重叠子问题使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题五步走状态定义确定 dp 数组下标及其含义状态转移初始化遍历顺序返回值动态规划代码有问题分析举例推导状态转移公式打印 dp 数组日志1.斐波那契数题目链接509. 斐波那契数 - 力扣LeetCode斐波那契数 通常用 F(n) 表示形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始后面的每一项数字都是前面两项数字的和。也就是F(0) 0F(1) 1F(n) F(n - 1) F(n - 2)其中 n 1给定 n 请计算 F(n) 。示例 1输入n 2输出1解释F(2) F(1) F(0) 1 0 1示例 2输入n 3输出2解释F(3) F(2) F(1) 1 1 2示例 3输入n 4输出3解释F(4) F(3) F(2) 2 1 3提示0 n 30代码 /1. 状态定义dp[i]为斐波那契数列的自变量idp[i] F(i)2. 状态转移dp[i] dp[i-1] dp[i-2]3. 初始化dp[0] 0, dp[1] 14. 遍历顺序正序5. 返回形式dp[n]*/public int fib(int n) {if(n 0 || n 1) {return n;}int a 0, b 1,sum 0;for(int i 2; i n; i) {sum a b;a b;b sum;}return sum;}2. 爬楼梯题目链接70. 爬楼梯 - 力扣LeetCode假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢示例 1输入n 2输出2解释有两种方法可以爬到楼顶。1 阶 1 阶2 阶示例 2输入n 3输出3解释有三种方法可以爬到楼顶。1 阶 1 阶 1 阶1 阶 2 阶2 阶 1 阶提示1 n 45思路代码 /1. 状态定义到达第 i 个台阶有 dp[i] 中方法2. 状态转移dp[i] dp[i-1] dp[i-2]3. 初始化dp[1] 1 dp[2] 2 注意题中要求 n 04. 遍历顺序从前往后5. 返回值返回 dp[n]/public int climbStairs(int n) {if(n 2) return n;int[] dp new int[n1];dp[1] 1;dp[2] 2;for(int i 3; i n; i) {dp[i] dp[i-2] dp[i-1];}return dp[n];}3. 使用最小花费爬楼梯题目链接使用最小花费爬楼梯给你一个整数数组 cost 其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。示例 1输入cost [10,15,20]输出15解释你将从下标为 1 的台阶开始。支付 15 向上爬两个台阶到达楼梯顶部。总花费为 15 。示例 2输入cost [1,100,1,1,1,100,1,1,100,1]输出6解释你将从下标为 0 的台阶开始。支付 1 向上爬两个台阶到达下标为 2 的台阶。支付 1 向上爬两个台阶到达下标为 4 的台阶。支付 1 向上爬两个台阶到达下标为 6 的台阶。支付 1 向上爬一个台阶到达下标为 7 的台阶。支付 1 向上爬两个台阶到达下标为 9 的台阶。支付 1 向上爬一个台阶到达楼梯顶部。总花费为 6 。提示2 cost.length 10000 cost[i] 999思路代码 /**1. 状态定义到达 i 位置最小花费 dp[i]2. 状态转移dp[i] min(dp[i-1]cost[i-1], dp[i-2]cost[i-2])3. 初始化dp[0] 0, dp[1] 0 前两个台阶是直接到达的不花费4. 遍历顺序从前往后5. 返回值dp[cost.length]/public int minCostClimbingStairs(int[] cost) {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-1]cost[i-1],dp[i-2]cost[i-2]);}return dp[len];}4. 不同路径题目链接62. 不同路径 - 力扣LeetCode一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 “Start” 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为 “Finish” 。问总共有多少条不同的路径示例 1输入m 3, n 7输出28示例 2输入m 3, n 2输出3解释从左上角开始总共有 3 条路径可以到达右下角。向右 - 向下 - 向下向下 - 向下 - 向右向下 - 向右 - 向下示例 3输入m 7, n 3输出28示例 4输入m 3, n 3输出6提示1 m, n 100题目数据保证答案小于等于 2 * 109思路代码/1. 状态定义dp[i][j] 表示从 (0,0) 到 ()2. 状态转移dp[i][j] dp[i-1][j] dp[i][j-1]3. 初始化 行dp[0][j] 1, 列dp[i][0] 14. 遍历顺序从左到右从上到下5. 返回值dp[m][n]*/ public int uniquePaths(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]; }5. 不同路径 II题目链接63. 不同路径 II - 力扣LeetCode一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 “Start” 。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为 “Finish”。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径网格中的障碍物和空位置分别用 1 和 0 来表示。示例 1输入obstacleGrid [[0,0,0],[0,1,0],[0,0,0]]输出2解释3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径向右 - 向右 - 向下 - 向下向下 - 向下 - 向右 - 向右示例 2输入obstacleGrid [[0,1],[0,0]]输出1提示m obstacleGrid.lengthn obstacleGrid[i].length1 m, n 100obstacleGrid[i][j] 为 0 或 1思路代码 /1. 状态定义 dp[i][j] 表示到达 (i,j) 位置有多少种走法2. 状态转移条件obs[i][j] 0 时才有这个方程表示这个位置没有障碍物dp[i][j] dp[i-1][j] dp[i][j-1] 3. 初始化条件当 obs[i][0] 0 时才有 dp[i][0] 1当 obs[0][j] 0 时才有 dp[0][j] 1 4. 遍历顺序从上到下从左到右5. 返回值当初始位置或结束位置 obs 为 1 时表示有障碍直接返回 0正常情况下返回 dp[m][n]/public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m obstacleGrid.length; // 行int n obstacleGrid[0].length; // 列if(obstacleGrid[0][0] 1 || obstacleGrid[m-1][n-1] 1) {return 0;}int[][] dp new int[m][n];// 初始化for(int i 0; i m obstacleGrid[i][0] 0; i) {dp[i][0] 1;}for(int j 0; j n obstacleGrid[0][j] 0; j) {dp[0][j] 1;}for(int i 1; i m; i) {for(int j 1; j n; j) {if(obstacleGrid[i][j] 0) {dp[i][j] dp[i-1][j] dp[i][j-1];}}}return dp[m-1][n-1];}6. 整数拆分题目链接343. 整数拆分 - 力扣LeetCode给定一个正整数 n 将其拆分为 k 个 正整数 的和 k 2 并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。示例 1:输入: n 2输出: 1解释: 2 1 1, 1 × 1 1。示例 2:输入: n 10输出: 36解释: 10 3 3 4, 3 × 3 × 4 36。提示:2 n 58思路代码 /**1. 状态定义对 i 进行拆分得到最大的积为 dp[i]2. 状态转移dp[i] Math.max(dp[i], Math.max(j(i-j), j * dp[i-j]));3. 初始化dp[0] 0,dp[1] 0,dp[2] 24. 遍历顺序从前向后5. 返回值dp[n]/public int integerBreak(int n) {int[] dp new int[n1];dp[2] 1;for(int i 3; i n; i) {for(int j 1; j i-j; j) {dp[i] Math.max(dp[i],Math.max(j(i-j), j*dp[i-j]));}}return dp[n];}7. 不同的二叉搜索树题目链接96. 不同的二叉搜索树 - 力扣LeetCode给你一个整数 n 求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种返回满足题意的二叉搜索树的种数。示例 1输入n 3输出5示例 2输入n 1输出1提示1 n 19思路代码/**1. 状态定义dp[i] 表示输入 i有 dp[i] 种不同的二叉搜索树2. 状态转移dp[i] dp[j-1]*dp[i-j]3. 初始化dp[0] 1, dp[1] 14. 遍历顺序从小到大5. 返回值dp[n] */ public int numTrees(int n) {int[] dp new int[n1];dp[0] 1;dp[1] 1;for(int i 2; i n; i) {for(int j 1; j i; j) {dp[i] dp[j-1]*dp[i-j];}}return dp[n]; }2. 背包问题