首页 > 编程语言 >算法练习-day32

算法练习-day32

时间:2023-07-26 19:32:09浏览次数:45  
标签:障碍物 机器人 走法 int 练习 day32 网格 算法 vector

动态规划

62. 不同路径

题意:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

实例:

算法练习-day32_动态规划

思路:本题我们已知机器人只能走右和下两种方向,因此我们就可以得出区域的上方和下方都只有一种走法。我们先创建一个二维数组dp,用于存储走法。先初始化二维数组,将0下标的全部走法设置为1,然后其他位置的走法数量等于上方数量+左方数量,最终返回目标位置

C++代码:

    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n));
        for(int i=0;i<n;i++)//这两个for循环就相当于初始化,区域的左边和上边只有一种可能,因此都是1
        {
            dp[0][i]=1;
        }
        for(int i=0;i<m;i++)
        {
            dp[i][0]=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];
    }

63. 不同路径 II

题意:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。

实例:

算法练习-day32_动态规划_02

思路:本题和上一题的代码几乎一模一样,只是在方法数量的累加和初始化方面多加了一些限制。

首先是初始化方面,如果我们在初始化过程中遇到了障碍物,那么该位置以及之后的位置都无法走到,即方法为0。其次是其他位置的累加方面,如果该位置有障碍物就不能进行方法的累加了,这样也可以避免累加到障碍物的情况,非常的简单

C++代码:

    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size(), n = obstacleGrid[0].size();
        vector<vector<int>> dp(m, vector<int>(n, 0));
        for (int i = 0; i<n; i++)
        {
            dp[0][i] = 1;
            if(obstacleGrid[0][i] == 1)//这里多加了一个条件,如果初始化遇到障碍,那么该位置及之后位置的元素都无法走到,全部设为0
            {
                while (i < n)
                {
                    dp[0][i] = 0;
                    i++;
                }
            }
        }
        for (int i = 0; i<m; i++)
        {
            dp[i][0] = 1;
            if(obstacleGrid[i][0] == 1)
            {
                while (i < m)
                {
                    dp[i][0] = 0;
                    i++;
                }
            }
        }
        for (int i = 1; i<m; i++)
        {
            for (int j = 1; j<n; j++)
            {
                if (obstacleGrid[i][j] != 1)//只要该位置没有障碍物就可以进行累加,并且障碍物位置的方法有0,也不怕别的位置累加
                {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[m - 1][n - 1];
    }

标签:障碍物,机器人,走法,int,练习,day32,网格,算法,vector
From: https://blog.51cto.com/u_15209404/6859229

相关文章

  • 代码随想录算法训练营第一天| LeetCode 704. 二分查找、LeetCode 27. 移除元素
    704.二分查找    题目链接:https://leetcode.cn/problems/binary-search/   视频链接:https://www.bilibili.com/video/BV1fA4y1o715     文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html    卡哥的题目建......
  • Google tile 和 TMS 的索引算法
    Googletile和TMS的索引算法TMS是tilemapservice的缩写,是一种瓦片地图服务,也称之为WMTS(webmaptileservice),具体的标准可以见OGC网站。TMS的算法很简单,就是把投影后的世界地图按照层级进行四叉树(待验证)切割,切割后的瓦片数量随层级呈金字塔型,数量和层级关系如下表所示: 对......
  • kmp算法的个人理解
    最长前后缀:假设有一段字符串:"aabaa"则这段字符串的前缀有:aaaaabaaba后缀:aaabaaabaa求最长公共前后缀的方法:找到前缀和后缀中相同的字符串:aaa其中最长的字符串为aa则"aabaa"这个字符串的最长公共前后缀为aaaa其长度为2按照以上的方式逐个计算"aabaa"中的每个子字符串得到......
  • 数据结构练习笔记——循环队列的基本操作
    循环队列的基本操作【问题描述】根据循环队列的类型定义,完成循环队列的基本操作。主函数中测试队列。【输入形式】一个整数m,表示入队的元素个数【输出形式】第一行:输出队头元素第二行:队列中元素依次出队以空格间隔【样例输入】5【样例输出】113579【样例输入】0【样......
  • 算法刷题笔记--并查集的运用
    1、题目描述:一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类:D[a][b]其中[a]和[b]表示两......
  • 算法学习--并查集相关知识及例题
    一、并查集的定义二、基本操作1、初始化一开始,每个元素都是独立的集合#include<iostream>usingnamespacestd;constintmaxN=1000;intfather[maxN];intmain(){for(inti=1;i<=maxN;i++){father[i]=i;}return0;}2、查找递推版本://返......
  • 一道简单的算法题
    ///<summary>///字符串str1与str2,若str1中的各个字符经过重排后能形成str2,则返回true。///str1="sawsdfdfalsraodf";///str2="world";///rearrange(str1,str2)->true;//////提示:检查str1中的各个字符的字符数是否大于str2各个字符的字符数即可///</summary>......
  • Vue中的虚拟DOM和Diff算法
    一、虚拟DOM1.什么是虚拟DOM?一个用来表示真实DOM节点的JS对象,主要包含标签名tag、属性attrs和子元素对象children属性等。代码示例如下:<divclass="contain"id="baseNo"><h4class="item">标题</h4><pclass="item">段落内容</p>&......
  • 粒子滤波(pf)、Mean Shift、KLT算法
    粒子滤波(pf)、MeanShift算法、KLT算法都是传统的目标跟踪算法。    粒子滤波算法(ParticleFilter),也称为蒙特卡洛滤波算法,是一种基于蒙特卡洛方法的非线性滤波算法,用于在非线性系统中进行状态估计和目标跟踪。粒子滤波算法的基本思想是通过一组随机采样的粒子来近似......
  • C语言分支与循环(8)--- 练习题(1)
    一.练习1.编写一段代码计算n的阶乘提示:如5的阶乘就是5*4*3*2*1以此类推例如以下代码:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<windows.h>intmain(void){ intn; intret=1; printf("请输入n的值:"); scanf("%d",&n); for(inti=1;i<......