leetcode第221题(最大正方形)的本地IDE实现及变形

问题描述:

      在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。PS:本文也对只包含0的最大正方形面积进行了运算

示例:

输入: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

输出: 4 
收获:
1.vector<string>v可以写成类似二维数组的形式 即v[i][j]代表一个字符
2.多维向量的声明及初始化line27:vector<vector<int>>dp(row,vector<int>(col,0))
或者vector<vector<int>>dp(row);for(int i=0;i<row;i++) dp[i].resize(col);
3.动态规划的知识
程序:

//

//  main.cpp

//  lc221-最大正方形

//

//  Created by Apple on 2019/3/18.

//  Copyright © 2019年 wangyu. All rights reserved.

//

 

#include <iostream>

#include <string>

#include <vector>

using namespace std;

int main(){

    vector<string>v;

    string s;

    int row;

    cin>>row;

    

    //int i=0;

    for(int i=0;i<row;i++){

        cin>>s;

        v.push_back(s);

    }

    int col=s.size();

    //int dp[row][col];

     /*求‘1’正方形的最大面积*/

   vector<vector<int>> dp(row, vector<int>(col, 0));//多维向量的声明和初始化

   // vector<vector<int>>dp(row);//另外一种多维向量声明和初始化方法

   // for(int i=0;i<row;i++)

     //   dp[i].resize(col);

    

        int res = 0;

    for (int i = 0; i < row; ++i) {

        for (int j = 0; j < col; ++j) {

            if (i == 0 || j == 0) { //初始化第一行、第一列

                dp[i][j] = v[i][j] – ‘0’;

            }

            else if (v[i][j] == ‘1’) {//动态规划

                dp[i][j] = min(dp[i – 1][j – 1], min(dp[i][j – 1], dp[i – 1][j])) + 1;

            }

            res =max(res, dp[i][j]);

        }

    }

    cout<< res*res<<endl;

    /*求‘0’正方形的最大面积*/

    vector<vector<int>> dd(row, vector<int>(col, 0));

    int ans=0l;

    for (int i = 0; i < row; ++i) {

        for (int j = 0; j < col; ++j) {

            if (i == 0 || j == 0) { //初始化第一行、第一列

                while(v[i][j]==‘0’){

                    dd[i][j] = v[i][j] – ‘0’+1;

                    break;

                    

                }

                while (v[i][j]==‘1’){

                    dd[i][j]=v[i][j]-‘1’;

                    break;

                }

                

            }

            else if (v[i][j] == ‘0’) {

                dd[i][j] = min(dd[i – 1][j – 1], min(dd[i][j – 1], dd[i – 1][j])) + 1;

            }

            ans=max(ans, dd[i][j]);

        }

    }

    cout<<ans*ans<<endl;

    cout<<max(ans*ans,res*res)<<endl;

}

posted on 2019-03-18 22:14 飞宇在飞 阅读() 评论() 编辑 收藏

版权声明:本文为feiyuzaifei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/feiyuzaifei/p/10555575.html