zoukankan      html  css  js  c++  java
  • LeetCode 85. Maximal Rectangle

    题目

    此题目动态规划可以解

    在矩阵上一层一层递推。

    dp[i][j]表示当前层,从i到j 可以形成矩形的最大面积。

    需要有两个DP数组,dp[i][j] 和dp2[i][j] , 在递推的过程相互轮换。dp[i][j]表示上一层的状态数组,dp2[i][j]表示当前层的状态数组

    状态转移方程是

    if(matrix[I...j]=1)
    dp2[i][j] = dp[i][j] + j-i+1;
    else
    dp2[i][j] = 0

    c++

    class Solution {
    public:
        int dp[195][195];
        int dp2[195][195];
        int maximalRectangle(vector<vector<char>>& matrix) {
            
            int n=matrix.size();
            if(n==0)
                return 0;
            int m=matrix[0].size();
            
            if(m==0)
                return 0;
            
            int ans=0;
            
            for(int i=0;i<m;i++)
            {
                if(matrix[0][i]=='1')
                {
                    dp[i][i]=1;
                    ans=max(ans,dp[i][i]);
                    for(int k=i-1;k>=0;k--)
                    {
                        if(matrix[0][k]=='1')
                        {
                            dp[k][i] = i-k+1;
                            ans=max(ans,dp[k][i]);
                        }
                        else
                            break;
                    }
                }
            }
            
            for(int i=1;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    if(matrix[i][j]=='1')
                    {
                        if(dp[j][j]!=0)
                        {
                            dp2[j][j] = dp[j][j]+1;
                            ans=max(ans,dp2[j][j]);
                        }
                        else
                        {
                            dp2[j][j]=1;
                            ans=max(ans,dp2[j][j]);
                        }
                        
                        for(int k=j-1;k>=0;k--)
                        {
                            if(matrix[i][k]=='1')
                            {
                                if(dp[k][j]!=0)
                                {
                                    dp2[k][j] = dp[k][j] + j-k+1;
                                }
                                else
                                {
                                    dp2[k][j] = j-k+1;
                                }
                                
                                ans=max(ans,dp2[k][j]);
                            }
                            else
                                break;
                        }
                    }
                  
                }
                
                for(int p=0;p<m;p++)
                {
                    for(int q=p;q<m;q++)
                    {
                        
                        dp[p][q]=dp2[p][q];
                        dp2[p][q]=0;
                    }
                }
                
            }
            
            return ans;
            
        }
    };
    
  • 相关阅读:
    异常
    gateway 网关
    Hystrix 图形化界面
    Hystrix 服务限流
    linux-CenOS修复内核或修改内核系统启动顺序
    Linux-CentOS不能yum update/upgrade.除非是初始环境
    Linux-CentOS配置网卡
    安装SQLSERVER2008提示错误SQL100MSI
    金蝶采购标志
    Pycharm社区版安装外部库文件
  • 原文地址:https://www.cnblogs.com/dacc123/p/11893457.html
Copyright © 2011-2022 走看看