首页 > 其他分享 >二维动态规划

二维动态规划

时间:2024-02-19 20:22:25浏览次数:26  
标签:int len1 dfs text2 len2 二维 text1 动态 规划

62.不同路径

力扣题目链接

解题思路

  1. 一个位置只能是左边的格子或者上面的格子到达,那么路径数就是左边格子的路径数加上上面格子的路径数

代码实现

int uniquePaths(int m, int n) {
    int dp[101][101] = {0};

    for (int i = 1; i <= n; i ++) {//赋值最上面的格子,因为只有左边的格子,所以只有一条路径
        dp[1][i] = 1;
    }

    for (int i = 1; i <= m; i ++) {//赋值最左边的格子,因为只有上面的格子,所以也只有一条路径
        dp[i][1] = 1;
    }

    for (int i = 2; i <= m; i ++) {
        for (int j = 2; j <= n; j ++) {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];//由左边的格子的路径数加上上面格子的路径数
        }
    }

    return dp[m][n];
}

64.最小路径和

力扣题目链接

解题思路

  1. 因为一个位置是由左边和上面的位置到的,因此当前位置的最小路径和也是由上面的最小路径和和左边的最小路径和构成的
  2. 那么当前位置的最小路径和就是两个位置的最小路径和再加上当前位置的和

思路:暴力递归

int min(int a, int b) {
    return a <= b? a: b;
}

//返回从(0, 0)到(i ,j)位置的最小路径和
int dfs(int** grid, int n, int m, int i, int j) {
    if (i == 0 && j == 0) {//到了起始位置,那么最小路径和就是它本身
        return grid[0][0];
    }

    int up = 9999;//上面的最小路径和
    int left = 9999;//左边的最小路径和

   if (i - 1 >= 0 && j >= 0)  {//有上面的路
       up = dfs(grid, n, m, i - 1, j);
   }

   if (j - 1 >= 0 && i >= 0) {//有左边的路
       left = dfs(grid, n, m, i, j - 1);
   }

   return (min(up, left) == 9999? 0: min(up, min)) + grid[i][j];//取两个位置中最小的和当前位置的值相加
}

int minPathSum(int** grid, int gridSize, int* gridColSize) {
    int n = gridSize;//行数
    int m = *gridColSize;//列数

    return dfs(grid, n, m, n - 1, m - 1);
}

代码实现

int min(int a, int b) {
    return a <= b? a: b;
}

int minPathSum(int** grid, int gridSize, int* gridColSize) {
    int dp[201][201] = {0};
    int n = gridSize;
    int m = *gridColSize;

    dp[0][0] = grid[0][0];

    for (int i = 1; i < m; i ++) {
        dp[0][i] = dp[0][i - 1] + grid[0][i];
    }
 
    for (int i = 1; i < n; i ++) {
        dp[i][0] = dp[i - 1][0] + grid[i][0];
    }

    for (int i = 1; i < n; i ++) {
        for (int j = 1; j < m; j ++) {
            dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
        }
    }

    return dp[n - 1][m - 1];
}

1143.最长公共子序列

力扣题目链接

解题思路

  1. 因为是子序列,所以就是要或者不要,又因为有两个字符串,所以子序列就是要最后一个字符或者不要最后一个字符
  2. 如果最后一个字符相等,那么先匹配

暴力递归

int max(int a, int b) {
    return a >= b? a: b;
}

//返回text1[0, len1 - 1]和text2[0, len2 - 1]中的最长公共子序列
int dfs(char* text1, char* text2, int len1, int len2) {
    if (len1 == 0 || len2 == 0) {//如果其中有一个长度为0,代表一个串没有字符了,那么最长公共子序列为0
        return 0;
    }

    int ans = 0;

    if (text1[len1 - 1] == text2[len2 - 1]) {//如果两个字符串的最后一个字符相等
        ans = 1 + dfs(text1, text2, len1 - 1, len2 - 1);//看前一个位置的最长公共子序列
    }
    else {//最后一个字符不相等
        ans = max(dfs(text1, text2, len1 - 1, len2), dfs(text1, text2, len1, len2 - 1));//要么要第最后一个字符串,要么不要最后一个字符串
    }

    return ans;
}

int longestCommonSubsequence(char* text1, char* text2) {
    return dfs(text1, text2, strlen(text1), strlen(text2));
}

代码实现

int max(int a, int b) {
    return a >= b? a: b;
}

//返回text1[0, len1 - 1]和text2[0, len2 - 1]中的最长公共子序列
int dfs(char* text1, char* text2, int len1, int len2) {
    if (len1 == 0 || len2 == 0) {//如果其中有一个长度为0,代表一个串没有字符了,那么最长公共子序列为0
        return 0;
    }

    int ans = 0;

    if (text1[len1 - 1] == text2[len2 - 1]) {//如果两个字符串的最后一个字符相等
        ans = 1 + dfs(text1, text2, len1 - 1, len2 - 1);//看前一个位置的最长公共子序列
    }
    else {//最后一个字符不相等
        ans = max(dfs(text1, text2, len1 - 1, len2), dfs(text1, text2, len1, len2 - 1));//要么要第最后一个字符串,要么不要最后一个字符串
    }

    return ans;
}

int longestCommonSubsequence(char* text1, char* text2) {
    int dp[1001][1001] = {0};
    int len1 = strlen(text1);
    int len2 = strlen(text2);

    for (int i = 1; i <= len1; i ++) {
        for (int j = 1; j <= len2; j ++) {
            if (text1[i - 1] == text2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            }
            else {
                dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
    }

    return dp[len1][len2];
}

标签:int,len1,dfs,text2,len2,二维,text1,动态,规划
From: https://www.cnblogs.com/lwj1239/p/18021425

相关文章

  • 【Spring】【Mybatis】【Dynamic-Datasource】【事务】Spring + MyBaits + 事务 + 动
    1 前言我上次有一篇是讲了从一个数据库连接的角度分析了 Spring+MyBaits+事务三者的联系,这是在数据源固定的情况下。那么可能会遇到,比如按租户的分库,这种情况下我们会引入动态的数据源比如苞米豆团队的Dynamic-Datasource或者是自己公司内部封装的工具、框架等,这节我们......
  • 路径规划算法使用说明
    1.基于搜索的(1)Dijkstra:执行命令:cd/home/slam/PathPlanning/Search_based_Planning/Search_2Dpython3Dijkstra.py(2)RTAAStarcd/home/slam/PathPlanning/Search_based_Planning/Search_2Dpython3RTAAStar.py(3)A*python3Astar.py其他算法都可以类似执行python......
  • Feign动态定义调用serverName与path
    Feign动态定义调用serverName与path查看原文方案一(DynamicProcessFeign)1.定义FeignClient工厂@ComponentpublicclassDynamicProcessFeign<T>{/***缓存feignClient,提高客户端性能*/privatestaticMap<String,Object>processMap=newHashMap<>......
  • 循环可变化的集合 数组 datatable 等 || c# winfrom DataGridView 动态UI下载功能
    Gif演示   分解步骤1,使用组件DataGridView2,使用DataSource来控制表格展示的数据来源(注意:来源需要是DataTable类型)3,需要用到异步线程。如果是不控制数据源的话,需要使用UI安全线程;(使用Control.Invoke或Control.BeginInvoke方法)4,DataGridView的列如果设置图片,尽量代码......
  • 探究二维码技术:连接现实与数字世界的桥梁
    引言:二维码已经成为现代社会中广泛应用的一种技术工具。它不仅在商业领域中被广泛使用,还在日常生活中发挥着重要的作用。本文将介绍二维码的概念、原理以及在不同领域中的应用,帮助读者更好地理解并利用二维码技术。二维码生成器|一个覆盖广泛主题工具的高效在线平台(amd79......
  • 动态分区插入数据.
      分区表数据加载--动态分区往hive分区表中插入加载数据时,如果需要创建的分区很多,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。所谓动态分区指的是分区的字段值是基......
  • 2024-02-18-物联网C语言(6-动态内存申请)
    6.动态内存申请6.1动态分配概述​ 在数组一章中,介绍过数组的长度是预先定义好的,在整个程序中固定不变,但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。​ 为了解决上述问题,C语言提供了-些内存管理函数,这些内存管理函数可以按需......
  • POLIR-Economics-Microeconomics: 经济模型{静态分析+比较静态分析+动态分析}}@<<西方
    经济理论经济理论是在对现实的经济事物的主要特征和内在联系进行概括和抽象的基础上,对现实的经济事务进行的系统描述;西方经济学家认为由于现实的经济事务是错综复杂的,所以在研究每一个经济事物时,往往要舍弃一些非基本的因素,只就经济事物的基本因素及其相互之间的......
  • Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换
    MySQL主从复制是一种常见的数据库架构,它可以提高数据库的性能和可用性。动态数据源切换则可以根据业务需求,在不同场景下使用不同的数据源,比如在读多写少的场景下,可以通过切换到从库来分担主库的压力。在本文中,我们将介绍如何在SpringBoot中实现MySQL动态数据源切换,使用My......
  • 动态规划(六)——树形dp
    树形dp,又称树状dp,即在树上进行的dp,在设计动态规划算法时,一般就以节点从深到浅(子树从小到大)的顺序作为dp的“阶段”,dp的状态表示中,第一维通常是节点编号(代表以该节点为根的子树)。大多数时候,我们采用递归的方式实现树形动态规划。对于每个节点x,先递归在他的每个子节点上进行dp,在回溯......