力扣算法刷题 Day 34

62 不同路径

题目链接

添加链接描述

思路

dp五部曲:

  1. dp[i][j]: 第i行第j列的方法数
  2. 状态转移方程:dp[i][j] = dp[i][j-1] + dp[i-1][j];
  3. 初始化:dp[1][1] = 1,为方便操作dp[][0]和dp[0][]初始化为0
  4. 遍历顺序:列优先
  5. 模拟:2 * 3,得到输出序列:1,1,1,1,2,3
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        dp[1][1] = 1;
        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(i == 1 && j == 1)
                {
                    continue;
                }
                dp[i][j] = dp[i][j-1] + dp[i-1][j];
                cout << dp[i][j];
            }
        }
        return dp[m][n];
    }
};

63 不同路径II

题目链接

添加链接描述

思路

dp五部曲:

  1. dp[i][j]: 第i行第j列的方法数
  2. 状态转移方程:dp[i][j] = dp[i][j-1] + dp[i-1][j];
  3. 初始化:dp[0][] = dp[][0] = 1,如果该节点为障碍物就跳过;
  4. 遍历顺序:列优先
  5. 模拟:2 * 3,障碍物坐标(2,2)得到输出序列:1,1,1,1,0,1
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if(obstacleGrid.back().back() == 1)    return 0;
        if(obstacleGrid[0][0] == 1) return 0;
        //cout << obstacleGrid.back().back();
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        //特殊情况处理:只有1行或只有1列,防止越界
        if( n == 1)
        {
            for(int i = 0; i < m; i++)
            {
               if(obstacleGrid[i][0] == 1)
               return 0;
            }
            return 1;
        }
        if(m == 1)
        {
            for(int i = 0; i < n; i++)
            {
                if(obstacleGrid[0][i] == 1)
                return 0;
            }
            return 1;
        }
        vector<vector<int>> dp(m,vector<int>(n));
        //初始化:需要注意ob之后的所有元素都不可直接到达,都为0
        for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++) //注意for循环在第一次遇到障碍物会跳出
        {
            dp[i][0] = 1;
        }
        for(int j = 0; j < n && obstacleGrid[0][j] == 0; j++)
        {
            dp[0][j] = 1;
        }
        
        //return 0;
        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];
            }
        }
        // for(int i = 0; i < m; i++)
        // {
        //     for(int j = 0; j < n; j++)
        //     {
        //         cout << dp[i][j] << ' ';
        //     }
        //     cout << endl;
        // }
        return dp[m-1][n-1];

    }
};

343 整数拆分

题目链接

添加链接描述

思路

这道题的关键在于dp的含义以及初始化。

刚拿到题分析:

2 = 1 + 1,最大值是1

3 = 1 + 2 = 1 + 1 + 1,最大值是2

4 = 1 + 3 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1,最大值是4

前者和后者的关联在哪里?

首先乘积公式应该是: j * (i- j),这里i-j可以进一步拆分,要找到i-j的拆分中的最大值。

因此,五部曲如下:

dp[i]的定义如下:数字i的拆分后最大乘积。

递推公式:dp[i] = max(dp[i], j * (i-j), j * dp[i-j]),这里的j要从1到i-1遍历.

初始化:dp[2] = 1,方便做题dp[1] = 1;

遍历顺序:从1到n

模拟:n = 5,输出序列为:1,1,2,4,6

文章详解

添加链接描述

cpp 复制代码
todo
相关推荐
一只幸运猫.4 小时前
2026Java 后端面试完整版|八股简答 + AI 大模型集成技术(最新趋势)
人工智能·面试·职场和发展
Old Uncle Tom4 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
会编程的土豆4 小时前
洛谷题单入门1 顺序结构
数据结构·算法·golang
生信碱移4 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
智者知已应修善业5 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
圣保罗的大教堂6 小时前
leetcode 1855. 下标对中的最大距离 中等
leetcode
智者知已应修善业7 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
.5487 小时前
## Sorting(排序算法)
python·算法·排序算法
wuweijianlove8 小时前
算法的平均复杂度建模与性能回归分析的技术7
算法·数据挖掘·回归
子琦啊8 小时前
【算法复习】字符串 | 两个底层直觉,吃透高频题
linux·运维·算法