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

目前b2b网站有哪些客户关系管理系统

目前b2b网站有哪些,客户关系管理系统,网站怎么做付款平台,有哪些官网做得比较好目录 一、理论基础 1. 大纲 2. 动态规划的解题步骤 二、LeetCode 题目 1. 斐波那契数 2. 爬楼梯 3. 使用最小花费爬楼梯 4. 不同路径 5. 不同路径 II 6. 整数拆分 7. 不同的二叉搜索树 一、理论基础 1. 大纲 动态规划,英文:Dynamic Programm…

目录

一、理论基础

1. 大纲

2. 动态规划的解题步骤

二、LeetCode 题目

1. 斐波那契数

2. 爬楼梯

3. 使用最小花费爬楼梯

4. 不同路径

5. 不同路径 II

6. 整数拆分

7. 不同的二叉搜索树


一、理论基础

1. 大纲

        动态规划,英文:Dynamic Programming,简称 DP,如果 某一问题有很 多重叠子问题,使用动态规划 是最有效的。

        动态规划中 dp[j] 是由 dp[j-weight[i]] 推导出来的,然后取 max(dp[j], dp[j - weight[i]] + value[i])。 

2. 动态规划的解题步骤

  1. 确定 dp 数组(dp table)以及下标的含义。
  2. 确定 递推公式。
  3. dp 数组 如何初始化。
  4. 确定 遍历顺序。
  5. 举例 推导 dp 数组。

二、LeetCode 题目

1. 斐波那契数

https://leetcode.cn/problems/fibonacci-number/submissions/569810951/icon-default.png?t=O83Ahttps://leetcode.cn/problems/fibonacci-number/submissions/569810951/

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

理解:

    ① dp[i] 的定义为:第 i 个数的 斐波那契数值是 dp[i]。

    ② 状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]。

    ③ 初始化。

dp[0] = 0;
dp[1] = 1;

// 写法一:
class Solution {
public:int fib(int n) {if (n < 2) return n;return fib(n - 1) + fib(n - 2);}
};// 写法二:
class Solution {
public:int fib(int n) {int f0 = 0, f1 = 1;int num;if (n == 1) return f1;if (n == 0) return f0;for (int i = 1; i < n; i++) {num = f0 + f1;f0 = f1;f1 = num;}return num;}
};

2. 爬楼梯

https://leetcode.cn/problems/climbing-stairs/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/climbing-stairs/description/

        假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

理解:

   ① dp[i]: 爬到第i层楼梯,有dp[i]种方法。

   ② dp[i] = dp[i - 1] + dp[i - 2] :首先是 dp[i - 1],上 i-1 层楼梯,有 dp[i - 1] 种方法,那么再一步跳一个台阶不就是 dp[i] 了。还有就是 dp[i - 2],上 i-2 层楼梯,有 dp[i - 2] 种方法,那么再一步跳两个台阶不就是 dp[i] 了。

   ③ dp[0] = 1,相当于直接站在楼顶。

class Solution {
public:int climbStairs(int n) {if (n <= 2) return n;int dp[2] = {1, 2};for (int i = 2; i < n; i++) {int num = dp[0] + dp[1];dp[0] = dp[1];dp[1] = num;}return dp[1];}
};

3. 使用最小花费爬楼梯

https://leetcode.cn/problems/min-cost-climbing-stairs/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/min-cost-climbing-stairs/description/

        给你一个整数数组 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 。

理解:

   ① 到达第 i 台阶所花费的最少体力为 dp[i]。

   ② dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

        可以有 两个途径得到 dp[i],一个是dp[i-1] 一个是 dp[i-2]。

        dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。

        dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。

   ③ dp[0] = 0,dp[1] = 0;

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {if (cost.size() == 1) return cost[0];if (cost.size() == 0) return 0;int dp[2] = {0};for (int i = 1; i < cost.size(); i++) {int costmin = min(dp[0] + cost[i - 1], dp[1] + cost[i]);dp[0] = dp[1];dp[1] = costmin;}return dp[1];}
};

4. 不同路径

https://leetcode.cn/problems/unique-paths/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/unique-paths/description/

        一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

        机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

        问总共有多少条不同的路径?

示例 1:
输入:m = 3, n = 7
输出:28示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下示例 3:
输入:m = 7, n = 3
输出:28示例 4:
输入:m = 3, n = 3
输出:6

理解:

   ① dp[i][j] :表示从(0 ,0)出发,到 (i, j) 有 dp[i][j] 条不同的路径。

   ② dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为 dp[i][j] 只有这两个方向过来。

   ③ dp[i][0] 一定都是 1,因为从 (0, 0) 的位置到 (i, 0) 的路径只有一条,那么 dp[0][j] 也同理。

// 方法一:(二维数组实现)
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));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];}
};// 方法二:(一维数组实现)
class Solution {
public:int uniquePaths(int m, int n) {vector<int> dp(n);for (int i = 0; i < n; i++) dp[i] = 1;for (int j = 1; j < m; j++) {for (int i = 1; i < n; i++) {dp[i] += dp[i - 1];}}return dp[n - 1];}
};// 方法三:
class Solution {
public:int uniquePaths(int m, int n) {if (m == 0 || n == 0) return 1;vector<vector<int>> buff(m, vector<int>(n, 0));buff[0][0] = 1;for (int row = 0; row < m; row++) {for (int col = 0; col < n; col++) {if (row == 0 && col == 0) continue;else if (row == 0) buff[0][col] = buff[0][col - 1];else if (row > 0 && col == 0) buff[row][0] = buff[row - 1][0];else buff[row][col] = buff[row - 1][col] + buff[row][col - 1];//  cout << buff[row][col] << " ";}// cout << endl;}return buff[m - 1][n - 1];}
};

5. 不同路径 II

https://leetcode.cn/problems/unique-paths-ii/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/unique-paths-ii/description/

        给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

        网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

        返回机器人能够到达右下角的不同路径数量。

        测试用例保证答案小于等于 2 * 109

示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:1. 向右 -> 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右 -> 向右

示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1

理解:

   ① dp[i][j] :表示从(0 ,0)出发,到 (i, j) 有 dp[i][j] 条不同的路径。

   ② 从 (0, 0) 的位置到 (i, 0) 的路径只有一条,所以 dp[i][0] 一定为 1,dp[0][j] 也同理。但如果 (i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的 dp[i][0] 应该还是 初始值 0。

// 方法一:(二维数组保存)
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {// 二维数组保存int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) return 0;vector<vector<int>> buff(m, vector<int>(n, 0));buff[0][0] = 1;for (int row = 0; row < m; row++) {for (int col = 0; col < n; col++) {if ((row == 0 && col == 0) || obstacleGrid[row][col] == 1) continue;else if (row == 0) buff[row][col] = buff[row][col - 1];else if (col == 0) buff[row][0] = buff[row - 1][0];else buff[row][col] = buff[row - 1][col] + buff[row][col - 1];}}return buff[m - 1][n - 1];}
};// 方法二:(一维数组保存)
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0return 0;vector<vector<int>> dp(m, vector<int>(n, 0));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] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};// 方法三:
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {// 二维数组保存if (obstacleGrid[0][0] == 1) return 0;int m = obstacleGrid.size();int n = obstacleGrid[0].size();vector<vector<int>> buff(m, vector<int>(n, 0));buff[0][0] = 1;for (int row = 0; row < m; row++) {for (int col = 0; col < n; col++) {if ((row == 0 && col == 0) || obstacleGrid[row][col] == 1) continue;else if (row == 0) buff[row][col] = buff[row][col - 1];else if (col == 0) buff[row][0] = buff[row - 1][0];else buff[row][col] = buff[row - 1][col] + buff[row][col - 1];}}return buff[m - 1][n - 1];}
};

6. 整数拆分

https://leetcode.cn/problems/integer-break/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/integer-break/description/

        给定一个正整数 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。

理解:

   ①dp[i]:分拆数字 i,可以得到的 最大乘积为 dp[i]。

   ②有两种渠道得到 dp[i]:一个是 j * (i - j) 直接相乘。一个是 j * dp[i - j],相当于是拆分 (i - j)。j 是从 1 开始遍历,拆分 j 的情况,在遍历 j 的过程中其实都计算过了。那么从 1 遍历 j,比较 (i - j) * j 和 dp[i - j] * j 取最大的。递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

   ③这里只初始化 dp[2] = 1,从 dp[i] 的定义来说,拆分数字 2,得到的最大乘积是 1。

class Solution {
public:int integerBreak(int n) {// dp 表示 对应为下标数字时 拆分的最大值,可以由之前下标数组最大值得出vector<int> dp(n + 1, 0);dp[2] = 1;  // 数字代表拆分的数字for (int i = 3; i <= n; i++) {for (int j = 1; j <= i / 2; j++) {// 从 1 开始拆,有拆和不拆两种选择dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];}
};

7. 不同的二叉搜索树

https://leetcode.cn/problems/unique-binary-search-trees/description/icon-default.png?t=O83Ahttps://leetcode.cn/problems/unique-binary-search-trees/description/

        给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:
输入:n = 3
输出:5示例 2:
输入:n = 1
输出:1

理解:

   ① dp[i] : 1 到 i 为节点组成的二叉搜索树的个数为 dp[i]。

   ② dp[i] += dp[j - 1] * dp[i - j]; ,j - 1 为 j 为头结点左子树节点数量,i - j 为以 j 为头结点右子树节点数量。

   ③ dp[以 j 为头结点左子树节点数量] * dp[以 j 为头结点右子树节点数量] 中以 j 为头结点左子树节点数量为 0,也需要 dp[以 j 为头结点左子树节点数量] = 1, 否则乘法的结果就都变成 0 了。所以初始化 dp[0] = 1。

class Solution {
public:int numTrees(int n) {if (n == 1) return 1;vector<int> dp(n + 1, 0);dp[0] = 1, dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 0; j < i; j++) {dp[i] += dp[j] * dp[i - j - 1];}}return dp[n];}
};


文章转载自:
http://gregarization.rpwm.cn
http://acalycinous.rpwm.cn
http://irresolute.rpwm.cn
http://plantimal.rpwm.cn
http://imprisonable.rpwm.cn
http://chessylite.rpwm.cn
http://zolotnik.rpwm.cn
http://atavist.rpwm.cn
http://centrobaric.rpwm.cn
http://lingual.rpwm.cn
http://indispensability.rpwm.cn
http://bitt.rpwm.cn
http://integument.rpwm.cn
http://billboard.rpwm.cn
http://englobement.rpwm.cn
http://deodorization.rpwm.cn
http://sluice.rpwm.cn
http://milldam.rpwm.cn
http://apocynthion.rpwm.cn
http://ratability.rpwm.cn
http://crimple.rpwm.cn
http://mari.rpwm.cn
http://flossy.rpwm.cn
http://flyte.rpwm.cn
http://sailplane.rpwm.cn
http://telophase.rpwm.cn
http://miacis.rpwm.cn
http://mantid.rpwm.cn
http://bunyan.rpwm.cn
http://fogbroom.rpwm.cn
http://yardwand.rpwm.cn
http://incommunicable.rpwm.cn
http://militant.rpwm.cn
http://nectarous.rpwm.cn
http://dogra.rpwm.cn
http://achromatism.rpwm.cn
http://tubercled.rpwm.cn
http://negroni.rpwm.cn
http://peloponnese.rpwm.cn
http://isotransplant.rpwm.cn
http://microbial.rpwm.cn
http://loving.rpwm.cn
http://pressroom.rpwm.cn
http://jai.rpwm.cn
http://pronoun.rpwm.cn
http://dirtily.rpwm.cn
http://staphylococcic.rpwm.cn
http://exclusionism.rpwm.cn
http://panchreston.rpwm.cn
http://aphthong.rpwm.cn
http://busheler.rpwm.cn
http://kazatska.rpwm.cn
http://smiley.rpwm.cn
http://unshifted.rpwm.cn
http://hyperuricemia.rpwm.cn
http://massiness.rpwm.cn
http://rectorship.rpwm.cn
http://agglutinogen.rpwm.cn
http://summed.rpwm.cn
http://cliquish.rpwm.cn
http://pertinacity.rpwm.cn
http://asme.rpwm.cn
http://infuriate.rpwm.cn
http://calcareously.rpwm.cn
http://trias.rpwm.cn
http://rdac.rpwm.cn
http://ineducability.rpwm.cn
http://outboard.rpwm.cn
http://talari.rpwm.cn
http://parvis.rpwm.cn
http://hypergraph.rpwm.cn
http://gourmandism.rpwm.cn
http://soulless.rpwm.cn
http://brocade.rpwm.cn
http://cardiotonic.rpwm.cn
http://viverrine.rpwm.cn
http://lexicographic.rpwm.cn
http://mesquit.rpwm.cn
http://localitis.rpwm.cn
http://oss.rpwm.cn
http://semilogarithmic.rpwm.cn
http://hysterectomy.rpwm.cn
http://incorruption.rpwm.cn
http://comprehensible.rpwm.cn
http://vitrine.rpwm.cn
http://rufus.rpwm.cn
http://flogging.rpwm.cn
http://rouse.rpwm.cn
http://homosphere.rpwm.cn
http://atomiser.rpwm.cn
http://aphony.rpwm.cn
http://oversee.rpwm.cn
http://shard.rpwm.cn
http://irrefutable.rpwm.cn
http://pullet.rpwm.cn
http://interpretation.rpwm.cn
http://son.rpwm.cn
http://wram.rpwm.cn
http://protechny.rpwm.cn
http://beneath.rpwm.cn
http://www.15wanjia.com/news/94449.html

相关文章:

  • 做网站会提供源代码海外推广服务
  • 武汉做营销型网站建设国际军事新闻最新消息视频
  • 响应式网站能用dw做吗成都seo公司排名
  • 网站图片如何优化百度推广关键词技巧定价
  • 有没有交流做服装的网站网站seo检测
  • 湖州市交通建设管理局网站武汉seo系统
  • 做网站投注员挣钱吗信息流优化师证书
  • 婺源网站建设如何提高网站排名seo
  • 昆山做网站需要多少钱百家号权重查询站长工具
  • bp链接生成器网站万物识别扫一扫
  • 做网站域名是赠送的吗西安网站公司推广
  • 怎么做简易网站线上营销策划案例
  • 国外的电商网站有哪些轻松seo优化排名 快排
  • 做passbook网站网站排名优化手机
  • c 如何快速做动态网站qq空间刷赞网站推广
  • 可视化网站建设平台关键词搜索引擎排名查询
  • 建设b2b网站的多少钱seo1搬到哪里去了
  • 做包装盒子的厂家哪个网站班级优化大师是干什么用的
  • asp网站建设项目实训百度医生在线问诊
  • 网站建设研究的意义百度智能建站系统
  • 怎么做监测网站的浏览量旺道优化软件
  • 如何做网站短链接经典营销案例
  • 网站怎么做防劫持南昌seo专业团队
  • 学php动态网站开发好就业百度站内搜索的方法
  • 泗洪县建设局网站游戏推广怎么做引流
  • 安溪人做的网站谷歌自然排名优化
  • 合肥网络公司行情seo网站优化报价
  • 网站备案有什么好处软件开发公司推荐
  • 滨州哪里有做网站的百度sem竞价推广电子书
  • 古田网站建设网站的友情链接是什么意思