LeeCode Practice Journal | Day34_DP02

1、确定dp数组及下标含义
2、确定递推公式
3、dp数组初始化
4、确定遍历顺序
5、举例推导dp数组

62. 不同路径

题目:62. 不同路径 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
二维斐波那契数列

solution
public class Solution {
    public int UniquePaths(int m, int n) {
        int[][] dp = new int[n][];
        for(int x = 0; x < n; x ++)
        {
            dp[x] = new int[m]; 
        }
        for(int i = 0; i < n; i ++)
        {
            for(int j = 0; j < m; j ++)
            {
                if(i == 0 || j == 0) dp[i][j] = 1;
                else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];               
            }
        }
        return dp[n - 1][m - 1];
    }
}
summary

dp:

1、dp[m][n]:到(m,n)位置有dp[m][n]种不同路径
2、dp[m][n] = dp[m - 1][n] + dp[m][n - 1]
3、dp[0][n] = 1; dp[m][0] = 1
4、从左上向右下

错误:

返回答案为dp[n - 1][m - 1], 而不是dp[n][m]

63. 不同路径Ⅱ

题目:63. 不同路径 II - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)

加入条件判断

solution
public class Solution {
    public int UniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.Length;
        int n = obstacleGrid[0].Length;

        int[][] dp = new int[m][];
        for (int i = 0; i < m; i ++)
        {
            dp[i] = new int[n];
        }
        for(int i = 0; i < m; i ++)
        {
            for(int j = 0; j < n; j ++)
            {
                if(obstacleGrid[i][j] == 1) dp[i][j] = 0;
                else
                {
                    if(i == 0 && j == 0) dp[i][j] = 1;
                    else if(i == 0) dp[i][j] = dp[0][j - 1];
                    else if(j == 0) dp[i][j] = dp[i - 1][0];
                    else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }

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

1、dp[m][n]:到(m,n)位置有dp[m][n]种不同路径
2、dp[m][n] = dp[m - 1][n](无障碍) + dp[m][n - 1](无障碍)
3、dp[0][n] = 1; dp[m][0] = 1
4、从左上向右下

错误:

1、int[ , ] VS int[][]:

  • int[,] 是一个真正的二维数组(矩阵),可以使用 GetLength 方法。
  • int[][] 是一个数组的数组,其长度是通过 Length 属性来获取的。

343. 整数拆分

题目:343. 整数拆分 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
笨比上线。。。

solution
public class Solution {
    public int IntegerBreak(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        
        int[] dp = new int[n + 1];
        
        // Initialize base cases
        dp[1] = 1;
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j < i; j++) {
                dp[i] = Math.Max(dp[i], Math.Max(j * (i - j), j * dp[i - j]));
            }
        }
        
        return dp[n];
    }
}
summary

1、dp[n]:n的拆分最大乘积
2、dp[n] = Max(dp[i], Math.Max(j * (i - j), j * dp[i - j])) 1 < m < n/2
3、dp[1] = 1

推导:

96. 不同的二叉搜索树

题目:96. 不同的二叉搜索树 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
忽然发现动态规划的本质好像是找规律。。。

solution
public class Solution {
    public int NumTrees(int n) {
        int[] dp = new int[n + 1];

        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; i ++)
        {
            for(int j = 1; j <= i; j ++)
            {
                dp[i] += dp[i - j] * dp[j - 1];
            }
        }

        return dp[n];
    }
}
summary

key:
可以看作1-n分别作为根节点的值,每次的种类为左子树种类和右子树种类的乘积

dp:

1、dp[n]:由 n 个节点组成且节点值从 1 到 n 互不相同的二叉搜索树有dp[n]种
2、dp[n] = sum(dp[i - 1] * dp[n - i])
3、dp[0] = 1; dp[1] = 1

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker是一种容器化平台,能够在不同的操作系统和环境中运行应用程序。它有助于提高开发、部署和管理应用程序的效率。 Docker_practice是一个公开的GitHub仓库,包含了一系列用于学习和练习Docker的实例代码和教程。这些实例代码涵盖了各种应用场景,能够帮助用户快速入门和掌握Docker的基本操作和高级功能。 在docker_practice仓库中,用户可以学习到如何构建、运行和管理Docker容器。其中包括了使用Dockerfile创建自定义镜像的方法,以及使用docker-compose进行容器编排的技巧。此外,还提供了一些Docker应用的实际示例,帮助用户了解如何在实际项目中应用Docker进行开发和部署。 通过docker_practice,用户可以逐步掌握Docker的使用技巧和最佳实践。这对于开发人员和系统管理员来说是非常有价值的,能够加快应用程序的部署速度,提升整体的开发效率。此外,Docker还能够提供一个可移植的部署环境,简化开发和测试过程,提供更高的可靠性和可扩展性。 总之,docker_practice是一个有助于学习和实践Docker的资源库,通过实例代码和教程,帮助用户掌握Docker的基本操作和高级功能,提高应用程序的开发和部署效率。 ### 回答2: Docker是一种开源的容器化技术,通过将应用程序及其依赖打包在容器中,实现了应用程序的快速部署、可移植性和可伸缩性。Docker的核心组件是Docker引擎,它是一个轻量级的虚拟化平台,可以在操作系统层面创建和管理容器。 使用Docker进行实践,可以带来很多好处。首先,Docker提供了一个一致性的运行环境,开发人员可以将应用程序及其依赖打包为一个镜像,并在不同的环境中进行部署,保证应用程序在不同的机器上能够以相同的方式运行。这样一来,开发人员可以更加专注于业务逻辑的开发,而不需要关心环境的配置和依赖的安装。 其次,Docker具有快速部署的特点。借助Docker的功能,我们可以非常快速地创建、启动和停止容器,提供了更加敏捷的应用程序开发和发布流程。同时,Docker还支持自动化部署,结合CI/CD工具,可以实现持续集成和持续部署。 另外,Docker提供了可伸缩性的解决方案。使用Docker Swarm或Kubernetes等容器编排工具,可以将应用程序的多个容器组织成一个集群,并进行负载均衡和自动扩缩容。这样,我们可以根据需求的变化,自动地增加或减少容器的数量,确保应用程序具有良好的性能和可用性。 最后,Docker还具有资源隔离的优势。每个Docker容器都相互隔离,拥有自己的文件系统、进程空间和网络接口。这样一来,即使将多个应用程序部署在同一台物理机器上,它们之间也不会相互影响,提高了系统的安全性和稳定性。 综上所述,Docker的实践可以极大地提高开发和部署的效率,同时也提供了更好的可伸缩性和资源隔离。它正在成为越来越多企业和开发者的首选技术,为应用程序的交付提供了更加可靠和可持续的解决方案。 ### 回答3: Docker是一个用于开发、部署和运行应用程序的开源平台。它允许开发者将应用程序及其依赖项打包为一个称为容器的独立运行环境。通过将应用程序和依赖项打包为容器,可以确保应用程序在不同的环境中具有相同的运行结果。 Docker的主要优势之一是轻量级和灵活性。容器只需包含运行所需的最基本的组件,减少了资源的消耗和管理的复杂性。此外,容器可以提供高度可移植性,可以在不同的操作系统和云平台上运行。 使用Docker进行实践也非常简单。首先,我们需要在本地机器上安装Docker引擎。然后,我们可以使用Docker命令行工具或Docker Compose配置文件来定义和管理容器。可以使用Docker Hub来获取或分享现有的Docker镜像,这些镜像可以作为容器的基础。Docker Hub是一个公共的注册表,它包含各种类型的镜像,供用户使用。 在实践中,我们可以使用Docker构建和测试应用程序,然后将其打包为一个容器并进行部署。通过使用容器,我们可以轻松地在不同的环境中部署和运行应用程序,包括开发、测试和生产环境。容器还提供了隔离性和安全性,可以确保一个容器中的应用程序不会影响其他容器或宿主机的运行。 总而言之,Docker是一个方便、高效和可移植的平台,可以帮助开发者更容易地构建、部署和管理应用程序。通过使用Docker,我们可以减少依赖项的冲突和环境配置的问题,并确保应用程序在不同的环境中具有一致的运行结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值