#include <algorithm>
#include <vector>
class Solution {
  public:

    int solve(vector<vector<char> >& matrix) {
        // 初始时对第一列和第一行进行赋值后,之后依次遍历,
        //当遇到为0的则仍然为0,当遇到为1,则比较对角和当前元素的该列和该行
        int n = matrix.size();//表示lie
        int m = matrix[0].size();//表示行
        if(n == 0) return 0;
        vector<vector<int>> dp(n, vector<int>(m));
        for (int i = 0; i < n; i++) dp[i][0] = (matrix[i][0] - '0');
        for (int i = 0; i < m; i++) dp[0][i] = (matrix[0][i] - '0');
        int maxlen = 0;
        for (int i = 1; i < n; i ++) {
            for (int j = 1; j < m; j++) {
                if (matrix[i][j] == '0') dp[i][j] = 0;
                else {
                   dp[i][j] = min(dp[i- 1][j - 1], min(dp[i -1][j], dp[i][j - 1])) + 1;
                }
                maxlen = max(dp[i][j], maxlen);
            }

        }
        return maxlen * maxlen;
    }
};