Maximal Rectangle

果然又是动态规划。

一开始也觉得是动态规划,但是对什么进行动态规划呢。

原来认为的2种结果证明都是错的:

1.记录每个元素左上角有多少个1,可这要m*n,难道再对每个矩形计算是否包含全是1?显然这是暴力的,不对!

2.对每个(i,j)记录其高宽有多少,乘一下,但是这显然不行,不知道哪个是0啊!

还想过递归,但是显然不行。

网上搜了下,果然又是动态规划,但是其记录的是每列前面有多少个连续数目是1.膜拜!!

都是动态规划,但是能想到的方法还是很独特的!!

有模仿别人的代码,看待原创能力还是不够啊!


class Solution {
public:
    int maximalRectangle(vector<vector<char> > &matrix) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(matrix.size()<=0)return 0;
        
        vector<vector<int>> countR;
        countR.resize(matrix.size());
        
        countR[0].resize(matrix[0].size());
        for(int j=0;j<matrix[0].size();j++)
        {
            countR[0][j]=(matrix[0][j]=='1')?1:0;
        }
        for(int i=1;i<matrix.size();i++)
        {
            countR[i].resize(matrix[0].size());
            for(int j=0;j<matrix[0].size();j++)
            {
                countR[i][j]=(matrix[i][j]=='1')?(countR[i-1][j]+1):0;
            }
        }
        
        int max_num=0;
        for(int i=0;i<matrix.size();i++)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                int w=1;
                int h=countR[i][j];
                for(int k=j;k>=0;k--)
                {
                    if(matrix[i][k]=='0') break;
                    
                    if(h>countR[i][k]) h=countR[i][k];
                    
                    int num=w*h;
                    if(num>max_num) max_num=num;
                    
                    w++;
                }
            }
        }
        return max_num;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值