原题链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/

相关题目:最大正方形

动态规划O(m * n * k)

dp[i][j][k]表示以(i,j)为右下角的边长为k的正方形是否全为1

状态转移:

dp[i][j][k]=1    if dp[i][j][1]&&dp[i-1][j][k-1]&&dp[i][j-1][k-1]&&dp[i-1][j-1][k-1]

代码:

int countSquares(vector<vector<int>>& matrix) {int m=matrix.size();int n=matrix[0].size();vector<vector<vector<int>>> dp(m+1,vector<vector<int>>(n+1,vector<int>(min(n,m)+1,0)));int ans=0;bool flag;//剪枝,当不再有符合条件的正方形则退出for(int k=1;k<=min(n,m);k++){flag=true;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(k==1){dp[i][j][k]=matrix[i-1][j-1];ans+=matrix[i-1][j-1];flag=false;}else{if(dp[i][j][1]&&dp[i-1][j][k-1]&&dp[i][j-1][k-1]&&dp[i-1][j-1][k-1]){dp[i][j][k]=1;ans+=1;flag=false;}}}}if(flag) break;}return ans;
}

优化O(m * n * k)

我们发现以(i,j)为右下角的正方形边长其实就是以(i,j)为右下角的正方形的种类数,如果我们以此为状态定义,将所有dp相加即是答案。如图(盗图):

dp[i][j]表示以(i,j)为右下角的正方形边长

状态转移:

dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1; if matrix[i-1][j-1]==1

代码:

int countSquares(vector<vector<int>>& matrix) {int m=matrix.size();int n=matrix[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));int ans=0;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(matrix[i-1][j-1]==1){dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;ans+=dp[i][j];}}}return ans;
}

leetcode算法题--统计全为 1 的正方形子矩阵相关推荐

  1. C语言求最大正方形子矩阵,动态规划—统计全为1的正方形子矩阵个数|最大正方形...

    最大正方形 (统计全为 1 的正方形子矩阵) 解析可以参考leetcode解析 public class Solution { public int countSquares(int[][] matr ...

  2. LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)

    1. 题目 给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1, ...

  3. leetcode1277. 统计全为 1 的正方形子矩阵(dp)

    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数.示例 1:输入:matrix = [[0,1,1,1],[1,1,1,1],[ ...

  4. leetcode算法题-- 买卖股票的最佳时机

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/ 这类股票题目请见leetcode算法题–最佳买卖股票时机含 ...

  5. leetcode算法题--买卖股票的最佳时机 II

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 这类股票题目请见leetcode算法题–最佳买卖股票 ...

  6. leetcode算法题--买卖股票的最佳时机含手续费

    原题链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/ 这类股票题目请见 ...

  7. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

  8. LeetCode算法题-Detect Capital(Java实现)

    这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...

  9. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

最新文章

  1. java字符串去重复_Java 8新特性:字符串去重
  2. 原型模式——HeadFirst设计模式学习笔记
  3. 二十年后我发明了保姆机器人作文_我想发明保姆机器人作文700字
  4. 基于Socket的java网络编程
  5. 对联系人进行增删改查
  6. junit测试类叫什么名字_使用Junit测试名称
  7. The LAO将于4月2日启动Neptune DAO,旨在为其他区块链项目提供流动性
  8. 解决无法打开虚拟机的方法
  9. 64位Windows 7平台安装32位Timesten,配置ODBC数据源
  10. Java中的java.util包
  11. 腾讯2012实习生招聘面试题:矩阵中A移动到B一共有多少走法
  12. Microsoft Silverlight 4 Tools for Visual Studio 2010
  13. 【Arduino 项目篇】智能窗户控制系统(附录:简单红绿灯制作)
  14. python表示倍数_python 求倍数
  15. 接上一篇Trao文本行数及省略号问题
  16. 画思维导图的注意事项有哪些?怎样画思维导图?
  17. Three.js实现跳一跳(在线玩)
  18. 如何修正XY轴不垂直误差
  19. 10年+工作经验总结:测试工程师职业成长路线图
  20. houghlines

热门文章

  1. 案例驱动python编程入门-事件驱动程序
  2. python语言自学-如何自学python语言
  3. python读取文件名-python读取文件名并改名字的实例
  4. 用python画玫瑰花教程-使用Python画一朵玫瑰花
  5. python装饰器函数-Python函数装饰器指南
  6. anaconda的python使用教程-Python安装教程之Anaconda入门使用总结
  7. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
  8. python代码示例图形-Python画高斯分布图形实例代码
  9. python处理多个excel文件-python多个excel文件合并成一个sheet
  10. Java中的运行期类型鉴定