leetcode 1277

本文介绍了一个LeetCode上的动态规划问题,通过构建二维数组dp来计算矩阵中能形成的正方形数量。详细解析了dp数组的填充逻辑,并给出了AC代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天做了一道dp的题,感觉和今年中科大夏令营上机题神似,题目如下(来自leetcode):
在这里插入图片描述

我的思路是设置一个二维数组dp,来保存一些信息。这个dp[i][j]保存的是什么呢?是以点 (i,j) 为正方形右下角顶点所能组成的正方形变成。例如上图的示例1,有:

dp=
[
    [0,1,1,1],
    [1,1,2,2],
    [0,1,2,3]
]

那么我们最终要计算的的就是数组dp的和。因此问题转化成了如何求dp。

当 matrix[i][j] == 0,显然 dp[i][j] == 0,因为如果以点 (i,j) 为一个正方形的右下角,肯定是构不成正方形的;

当 matrix[i][j] == 1,且i == 0或j == 0时,dp[i][j]==1;

当 matrix[i][j] == 1,且i > 0和j > 0时,需要从点 (i,j) 出发,向上和左方向去搜索 dp[i-1][j-1] 个单位,如果遇到0则跳出,反之不断加1。

AC代码如下:

class Solution {
public:
    int countSquares(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<vector<int>> dp(n,vector<int>(m,0));
        int cnt = 0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
            	//原矩阵数值为0,则dp为0
                if(matrix[i][j]==0)
                {
                    dp[i][j] = 0;
                }
                //原矩阵数值为1,先令dp为1
                else if(matrix[i][j]==1)
                {
                    dp[i][j] = 1;
                }
                //如果原矩阵点的值为1,且该点上侧和左侧非空
                if(i>=1&&j>=1&&matrix[i][j]==1)
                {
                	//分别向上和向左搜索dp[i-1][j-1]个单位
                    for(int k=1;k<=dp[i-1][j-1];k++)
                    {
                    	//如果上侧和左侧的值都为1,则dp自增1
                        if(matrix[i-k][j]==1&&matrix[i][j-k]==1)
                        {
                            dp[i][j]++;
                        }
                        //遇到0跳出
                        else
                        {
                            break;
                        }
                    }
                }
                cnt += dp[i][j];
            }
        }
        return cnt;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值