果然又是动态规划。
一开始也觉得是动态规划,但是对什么进行动态规划呢。
原来认为的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;
}
};