题解 | #奶牛的活动面积# DP

奶牛的活动面积

https://www.nowcoder.com/practice/666cb0dd46a2439fb7c44d24a9918bf7

知识点

动态规划

思路

维护每个点的上边的连续的C的个数, 左边的连续的C的个数, 以及以该点为右下角的由C组成的正方形的长度;

上边和左边是很好维护的, 我们考虑如果当前点不是左上两条边的点的话, 那么如果满足当前点上面连续的C的个数和左边的连续的C的个数均大于f[i-1][j-1], 那么f[i][j]就可以在f[i-1][j-1]的基础上+1

AC Code (C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param land char字符型vector<vector<>> 
     * @return int整型
     */
    int maximalSquare(vector<vector<char> >& land) {
        int n = land.size(), m = land[0].size();
        vector<vector<int>> l(n, vector<int>(m, 0));
        vector<vector<int>> up(n, vector<int>(m, 0));
        vector<vector<int>> f(n, vector<int>(m, 0));

        int res = 0;
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < m; j ++) {
                if (land[i][j] == 'E') continue;
                l[i][j] = (j ? l[i][j - 1] : 0) + 1;
                up[i][j] = (i ? up[i - 1][j] : 0) + 1;
                if (i == 0 or j == 0) {
                    f[i][j] = 1;
                }
                else {
                    int len = f[i - 1][j - 1];
                    if (l[i][j] > len and up[i][j] > len) f[i][j] = f[i - 1][j - 1] + 1;
                }
                res = max(res, f[i][j]);
            }
        }
        return res * res;
    }
};

全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
牛客963010790号:为什么还要收藏
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务