动态规划+栈
方法一仅动态规划:
仅求行的和,当位置本身未0时则,依次点为中心的矩阵皆为0,若当前位置为1,则该位置左侧值+1,这样我们可以求去以当前位置为右下角的矩阵的宽度
我们从该位置向上看,来寻找以该位置为右下角的最大矩阵面积,最合适的宽度*最合适的高度,算出面积与最大值做比较,选择最大值保存
class Solution {
public:int maximalRectangle(vector& matrix) {// 动态规划,如果当前位置是1,那么当前位置观看上和左的值// 自作向右遍历,自上向下遍历// 注意判断四个边界if(matrix.empty()){return 0;}int row = matrix.size();int col = matrix[0].size();vector> path(row+1,vector(col+1,0));int max_val = 0;for(int i=0;i=0&&path[k][j]!=0){// 计算目前矩阵的面积col_min = min(col_min,path[k][j]); // 可以获得目前矩阵的宽int h = i-k+1; // 目前矩阵的高max_val = max(max_val,h*col_min); // 计算面积与最大面积比较k--;}}else {if(matrix[i][j] == '0'){path[i][j] = 0;}else{path[i][j]=path[i][j-1]+1;}// 向上看寻找合适的矩阵int k = i;int col_min = 201; // 用来标记列中的最小值while(k>=0&&path[k][j]!=0){// 计算目前矩阵的面积col_min = min(col_min,path[k][j]); // 可以获得目前矩阵的宽int h = i-k+1; // 目前矩阵的高max_val = max(max_val,h*col_min); // 计算面积与最大面积比较k--;}}cout<