leeCode动态规划(矩阵求最大正方形面积)

题目

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

实例

输入:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4

代码实例

class Solution {
public int maximalSquare(char[][] matrix) {
    int maxArea = 0;
    if(matrix==null || matrix.length==0 || matrix[0].length==0){
        return maxArea;
    }else{
        int rows = matrix.length,columns = matrix[0].length;
        int maxL = 0;
        int dp[][] = new int[rows][columns];
        for(int i=0;i<=rows-1;i++){
            for(int j=0;j<=columns-1;j++){
                if(matrix[i][j]=='1'){
                    if(i == 0|| j==0){
                        dp[i][j] = 1;
                    }else{
                        dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]))+1;
                    }
                    maxL = Math.max(dp[i][j], maxL);
                }                   
            }
        }
        //maxArea = maxL*maxL;
        return maxL*maxL;
    }
}}

详解

  • 考虑特殊情况
    输入的数组为空的情况,直接返回maxArea值为0
  • 其他情况
    求取最大边数,然后求得平方即为矩阵内最大正方型面积。matrix看做a.当前点为0时,那么仍然为0,当前点为1时,他所受最小面积影响为相邻a[i-1][j-1],a[i-1][j],a[i][j-1],即左侧相邻,上侧相邻,左对角三个影响。在a[i][j]的值在原值不为0的情况下(即为1的情况下)取三者最小值再加1。设置一个最大边长值maxL,默认值为0,与当前的a[i][j]取最大值,循环遍历a[][],获取修改后矩阵的最大值,即为最大边长。
    代码中 matrix[i][j]==‘1’ 是默认原matrix[?][?]=0的值仍然为0.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 矩阵连乘问题是一个经典的动态规划问题。给定一系列矩阵它们的连乘积,如何使得计算次数最少? 设矩阵序列为 A1, A2, A3,..., An,其中 Ai 的规模为 pi-1×pi,i=1,2,...,n+1。定义m[i][j]为Ai×Ai+1×...×Aj的最小计算次数,则有递推公式: m[i][j] = min{ m[i][k] + m[k+1][j] + pi-1×pk×pj },其中 i ≤ k < j,i ≤ j ≤ n+1 其中,m[i][i]=0,因为一个矩阵乘以它自身不需要计算。最终所的结果为m[1][n]。 下面是Python代码实现: ```python def matrix_chain_order(p): n = len(p) - 1 m = [[float('inf') for _ in range(n+1)] for _ in range(n+1)] for i in range(1, n+1): m[i][i] = 0 for l in range(2, n+1): for i in range(1, n-l+2): j = i + l - 1 for k in range(i, j): q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j] if q < m[i][j]: m[i][j] = q return m[1][n] ``` 其中,p是一个列表,表示矩阵序列每个矩阵的规模。例如,如果有4个矩阵,它们的规模分别为2×3、3×4、4×2、2×5,则p=[2, 3, 4, 2, 5]。 调用matrix_chain_order(p)即可得到最小计算次数。 ### 回答2: 动态规划矩阵连乘问题是一种通过分解问题,将大问题拆分为子问题并逐步解的方法。它主要通过穷举解空间,记录中间计算结果,从而避免重复计算,提高计算效率。 假设有 n 个矩阵需要连乘,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从第 i 个矩阵到第 j 个矩阵连乘所需的最小计算次数。 首先,我们需要确定问题的状态转移方程。对于 dp[i][j],我们可以将其划分为两段进行计算,从 i 到 k 连乘,再从 k+1 到 j 连乘,其中 i <= k < j。那么 dp[i][j] 可以表示为 dp[i][k] + dp[k+1][j] + 第 i 个矩阵的行数 * 第 k+1 个矩阵的列数 * 第 j+1 个矩阵的列数。 接下来,我们需要确定问题的边界条件。当 i 和 j 相等时,也就是只有一个矩阵时,连乘次数为 0,即 dp[i][i] = 0。而对于其他情况,我们可以将 dp[i][j] 初始化为一个较大的值,比如无穷大。 最后,我们可以使用动态规划的方式进行计算,从长度为 2 的子问题开始,逐步扩展到整个问题规模。具体的计算步骤如下: 1. 初始化 dp 数组,将所有 dp[i][j] 设置为无穷大。 2. 对于长度为 2 的子问题,计算 dp[i][i+1] = 第 i 个矩阵的行数 * 第 i 个矩阵的列数 * 第 i+1 个矩阵的列数。 3. 根据状态转移方程,从长度为 3 的子问题开始计算 dp 数组的其他值。 4. 重复步骤 3,直到计算完整个 dp 数组。 5. 最终,dp[1][n] 即为从第一个矩阵到第 n 个矩阵连乘的最小计算次数。 通过动态规划方法,可以高效地解决矩阵连乘问题,避免了重复计算,提高了计算效率。 ### 回答3: 动态规划矩阵连乘问题是指给定一个矩阵链,解最小的矩阵连乘次数以及括号化方案。首先,我们需要定义一个矩阵链的表示方法,假设有n个矩阵,那么矩阵链可以表示为[A1,A2,...,An]。 接下来,我们需要定义一个二维的动态规划数组dp,其中dp[i][j]表示从矩阵Ai到矩阵Aj的最小连乘次数。根据动态规划的思想,我们可以得到以下状态转移方程: dp[i][j] = min(dp[i][k] + dp[k+1][j] + cost[i-1] * cost[k] * cost[j]),其中i ≤ k < j。 其中,cost数组表示矩阵Ai的行数和矩阵Aj的列数,cost的长度为n+1,其中,cost[0]表示矩阵A1的行数,cost[n]表示矩阵An的列数。 根据上述状态转移方程,我们可以使用双重循环来计算dp数组的值。外层循环控制子问题规模,内层循环用于遍历所有的子问题。 最后,根据dp数组的值,可以通过递归的方式构造出最小连乘次数对应的括号化方案。 综上所述,通过动态规划算法,我们可以矩阵连乘问题,得到最小的矩阵连乘次数以及括号化方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值