标题说明:给定一个二维矩阵,其中包含0、1个字符串,请在最大的正方形中找到仅包含1个字符串的区域。例如:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0答案是4。问题解决的思想:动态编程。 dp [i] [j]是最大正方形的边长,其中(i,j)是右下角的顶点。从左到右和从上到下扫描矩阵。当发现:1.(i,j),(i-1,j),(i,j-1)三个位置都为1时,(i,j)该值可以形成面积为此值的左上角有一定大小。例如:1 0 1 0 01 0 1 1 11 1 1 1下一次扫描(2,4),发现(i,j),(i-1,j),(i,j-1)都是三个位置如图1所示,则(i,j)的值可以与其他五个矩阵组成一个矩阵。但是标题需要的是正方形的大小,因此我们必须在dp(i-1,j-1),dp(i-1,j),dp(i,j-1)中找到最小值min ,这是最小的值是三个正方形的最小边长,这三个值作为右下角的顶点。扫描(i,j)的值,我们发现它可以被补充到一个更大的矩阵中,因此补码之后的最小正方形边长必须能够增加1,因此让dp(i,j)= min + 1.寻找dp(i-1,j-1),dp(i-1,j),dp(i,j- 1中的最小值)的原因是因为补数是矩阵,并且宽度矩阵的长度限制了正方形的边长。 2.当三个位置(i,j),(i-1,j),(i,j-1)中的一个为0时,肯定无法将其填充为矩形,因此dp(i,j)= 0扫描在此过程中,变量res记录找到的最大正方形的边长。最终代码如下:class SoluTIon {public:int maximalSquare(vector“ vector“ char”””& amp; matrix))(if(matrix.size()== 0)返回0; int row = matrix .size(),col =矩阵[0] .size(); int res = 0;矢量“ int”; dp(col,0); //第一行for(int i = 0; i“ col; i ++)dp [i] =矩阵[0] [i]-& lsquo; 0& rsquo ;; res = max(res,* max_element(dp。 begin(),dp.end())); // dpfor(int i = 1; i“ row; i ++){//第一个coldp [0] =矩阵[i] [0]-& lsquo; 0amp ; rsquo ;; //其他colsfor(int j = 1; j《 col; j ++){if(matrix [i] [j] ==& lsquo; 1& rsquo;){Int temp = min(dp [j ],dp [j-1]); dp [j] = temp +(矩阵[i-temp] [j-temp]-& lsquo; 0& rsquo;);}否则{dp [J] = 0; }} res = max(res,* max_element(dp.begin(),dp.end()));}返回res * res;}};