1. 记忆化搜索 - 自上向下的解决问题:使用vector来保存每次计算的结果,如果下次再碰到同样的需要计算的式子就不需要重复计算了。

2. 动态规划 - 自下向上的解决问题

解法一:自顶向下

解法二:自底向上

class Solution {

private:
vector<int> memo; int calcWays(int n){ if(n==) return ; //一个台阶都没有
if(n==) return ;
//if(n==2) return 2; //有两种解决方法:一次迈一步,迈两次;一次迈两步
if(memo[n] == -)
memo[n] = calcWays(n-) + calcWays(n-);
//在第n-1阶台阶迈一步或者在第n-2阶台阶迈两步
return memo[n];
} public:
int climbStairs(int n) {
//n为台阶数
memo = vector<int>(n+,-); //memo初始化为n+1个-1
return calcWays(n);
}
};
class Solution {

public:
int climbStairs(int n) {
//n为台阶数
vector<int> memo(n+,-); //memo初始化为n+1个-1
memo[] = memo[] = ;
for(int i=;i<=n;i++)
memo[i] = memo[i-] + memo[i-];
return memo[n];
}
};

注意:从2只能移动到3和4;从3只能移动到6和5.

思路:设从位置(i,j)达到底部的最小路径和为MP(i,j);根据约束条件,从位置(i,j)只能达到下一行的(i+1,j)和(i+1,j+1)两个位置;

前面的思路是自顶向下的,如果采用自底向上的求解思路,最后的sum[0]是要的结果。可以申请一个一维数组初始化为三角形数阵底部向量,逐步向上计算更新,空间复杂度为O(n)

class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int length = triangle.size();
if(length==) return ;
if(length==) return triangle[][];
vector<int> sum = triangle[length-]; //初始化sum为三角形底部的向量 for(int i=length-;i>=;i--){
for(int j=;j<triangle[i].size();j++)
sum[j] = min(triangle[i][j]+sum[j], triangle[i][j]+sum[j+]);
} return sum[];
}
};

这个解法是重做了一遍题想到的,感觉比上一个解法有点麻烦,还容易索引溢出。

class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if(triangle.empty()) return ;
int row = triangle.size();
int column = triangle[row-].size();
int dp[row][column+];
for(int i=; i<row; i++){
for(int j=; j<column+; j++){
dp[i][j] = INT_MAX;
}
}
dp[][] = triangle[][]; for(int i = ; i < row; i++){
for(int j=; j<=i+; j++){ dp[i][j] = min(dp[i-][j-], dp[i-][j]) + triangle[i][j-];
}
} sort(dp[row-], dp[row-]+column+);
return dp[row-][];
}
};

题目:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例:

输入:
[[1,3,1],
[1,5,1],
[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

思路

以输入为 3*3 的网格为例,其中 m=3,n=3
[1,3,1]
[1,5,1]
[4,2,1]
由于每次只能向下或者向右移动,则每一步结果为当前值+min(上边一步,左边一步),即 dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])

注意:不要忘记dp[0][0]的初始化。

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
if(grid.size() == ) return ;
int m = grid.size();
int n = grid[].size();
int dp[m][n]; //m行n列的一个二维数组
dp[][] = grid[][];
//初始化边界
for(int i = ; i<m; i++){
dp[i][] = grid[i][] + dp[i-][]; //最左边一列的值只能是当前格子+上面一个
}
for(int i=;i<n;i++){
dp[][i] = grid[][i] + dp[][i-]; //最上面一行的值只能是当前格子+左边一个
}
for(int i=;i<m;i++){
for(int j=;j<n;j++)
dp[i][j] = grid[i][j] + min(dp[i-][j], dp[i][j-]);
} return dp[m-][n-];
}
};

解法二:又做了一遍,自己想出来了思路

1)设置一维数组 dp[i] 为 当前行存储的到该索引的最小和;

2)初始化dp为grid的第一行,即  dp[0] = grid[0][0]; 然后接下来dp[i] = dp[i-1] + grid[0][i];

3) 状态方程:dp[j] = min(dp[j-1]+grid[i][j], dp[j]+grid[i][j]); //取左边或上面到该索引的最小值

4)dp最左边一列只能从上面走到。

class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[].size();
int dp[m] = {};
dp[] = grid[][];
for(int i=; i<m;i++){
dp[i] = dp[i-] + grid[][i]; } for(int i=; i<n; i++){
for(int j=; j<m ; j++){
if(j==)
dp[j] = dp[j] + grid[i][j];
else{
dp[j] = min(dp[j-]+grid[i][j], dp[j]+grid[i][j]);
}
}
}
return dp[m-];
}
};

动态规划 70.climbing Stairs的更多相关文章

  1. LN : leetcode 70 Climbing Stairs

    lc 70 Climbing Stairs 70 Climbing Stairs You are climbing a stair case. It takes n steps to reach to ...

  2. Leetcode之70. Climbing Stairs Easy

    Leetcode 70 Climbing Stairs Easy https://leetcode.com/problems/climbing-stairs/ You are climbing a s ...

  3. 42. leetcode 70. Climbing Stairs

    70. Climbing Stairs You are climbing a stair case. It takes n steps to reach to the top. Each time y ...

  4. Leetcode#70. Climbing Stairs(爬楼梯)

    题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解 ...

  5. 377. Combination Sum IV 70. Climbing Stairs

    back function (return number) remember the structure class Solution { int res = 0; //List<List< ...

  6. 刷题70. Climbing Stairs

    一.题目说明 题目70. Climbing Stairs,爬台阶(楼梯),一次可以爬1.2个台阶,n层的台阶有几种爬法.难度是Easy! 二.我的解答 类似的题目做过,问题就变得非常简单.首先用递归方 ...

  7. LeetCode练题——70. Climbing Stairs

    1.题目 70. Climbing Stairs——Easy You are climbing a stair case. It takes n steps to reach to the top. ...

  8. [LeetCode] 70. Climbing Stairs 爬楼梯问题

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  9. [LeetCode] 70. Climbing Stairs 爬楼梯

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

随机推荐

  1. Hadoop完全分布式环境搭建(三)——基于Ubuntu16.04安装和配置Java环境

    [系统环境] 1.宿主机OS:Win10 64位 2.虚拟机软件:VMware WorkStation 12 3.虚拟机OS:Ubuntu16.04 4.三台虚拟机 5.JDK文件:jdk-8u201 ...

  2. Luogu 2573 [SCOI2012]滑雪

    BZOJ 2753 首先可以按照题目要求的把所有的有向边建出来,然后进去广搜就可以求出第一问的解,然后考虑如何求解第二问,我们把所有搜到的边按照到达的点的高度位第一关键字,边的长度为第二关键字排序之后 ...

  3. HttpSession解决表单的重复提交

    1). 重复提交的情况: ①. 在表单提交到一个 Servlet, 而 Servlet 又通过请求转发的方式响应一个 JSP(HTML) 页面, 此时地址栏还保留着 Serlvet 的那个路径, 在响 ...

  4. [GO]数组做函数参数

    package main import "fmt" //数组为函数参数,实际上是值传递//实参数据里的每个元素,给形参数组拷贝一份//这里形参的数组其实就是实参的复制品 func ...

  5. Densely Connected Convolutional Networks(緊密相連卷積網絡)

    - Dense blocks where each layer is connected to every other layer in feedforward fashion(緊密塊是指每一個層與每 ...

  6. 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护

    建议40:使用event关键字为委托施加保护 在建议中我们实现了一个具有通知功能的文件传输类,如下: class FileUploader { public delegate void FileUpl ...

  7. ORACLE_ERP帐务分录

      ORACLE MRPII各模块会计分录   第一章 采购模块 一.资产采购(科目来源:库存组织) 1.物料接收 借  材料采购     接收数量*采购单价 贷 应计暂估     接收数量*采购单价 ...

  8. 原型(Prototype)模式

    一. 原型(Prototype)模式 原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象. 从孙大圣的手段谈起 孙悟空在与黄风怪的战斗中 ...

  9. HTML5游戏开发进阶指南 中文pdf扫描版​

    HTML5游戏开发进阶指南介绍了HTML5游戏开发的一般过程和技巧.全书共分12章,第1章介绍了本书相关的HTML5的诸多新特性,包括在canvas上绘图.播放声音等,另外还引入了子画面页的概念:第2 ...

  10. C# enum 枚举 反射

    枚举遍历 public enum EMyType { [System.ComponentModel.Description("A类型")] TypeA = 1, [System.C ...