首页 > 其他分享 >【DP】LeetCode 221. 最大正方形

【DP】LeetCode 221. 最大正方形

时间:2023-04-24 16:55:57浏览次数:57  
标签:221 matrix 正方形 int ++ dp LeetCode DP result

题目链接

221. 最大正方形

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums1 前 i 个元素(即 nums1[i - 1])组成和以 nums2 前 j 个元素(即 nums2[j - 1])组成的状态,以此类推

字符串也是个数组,是字符数组

表示状态

状态表示就是靠猜,但是会有猜的套路,一般都是通过最终结果和数组数量来猜

找状态转移方程

思考的方向是:大问题的最优解怎么由小问题的最优解得到

image

参考图来自理解 三者取最小 +1

边界处理

代码

dp数组版

class Solution {
    public int maximalSquare(char[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        // dp[i][j] 表示以 (i, j) 点为右下角的正方形最大边长
        int[][] dp = new int[m][n];

        for(int i = 0; i < n; i++){
            dp[0][i] = matrix[0][i] - '0';
        }
        for(int i = 0; i < m; i++){
            dp[i][0] = matrix[i][0] - '0';

        }

        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                if(matrix[i][j] == '1'){
                    // 取最小值的原因是防止 (i, j) 所在的行和列中有0
                    // 如果取最大值,可能小矩阵里没有0,大矩阵里有0,但是依然是按照小矩阵的边长来算
                    // 类似木桶原理:最大边长取决于边长最短的那个正方形
                    dp[i][j] = Math.min(
                            dp[i - 1][j],
                            Math.min(dp[i][j - 1], dp[i - 1][j - 1])
                    ) + 1;
                }
            }
        }
        int result = 0;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                result = Math.max(result, dp[i][j]);
            }
        }

        return result * result;
    }
}

标签:221,matrix,正方形,int,++,dp,LeetCode,DP,result
From: https://www.cnblogs.com/shixuanliu/p/17350088.html

相关文章

  • LeetCode 周赛 342(2023/04/23)容斥原理、计数排序、滑动窗口、子数组 GCB
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。前天刚举办2023年力扣杯个人SOLO赛,昨天周赛就出了一场Easy-Easy-Medium-Medium的水场,不得不说LeetCode是懂礼数的......
  • leetcode343. 整数拆分
    classSolution{public:intf[60];//f[i]记录i能拆出的最大乘积intintegerBreak(intn){for(inti=2;i<=n;i++)for(intj=1;j<i;j++)//枚举最后一个拆出的数字,这里不能只循环到i/2f[i]=max(f[i],max(j*f[i-j],j*(i-j)));......
  • leetcode377.组合总和IV
    classSolution{public:longlongf[1010];//f[i]表示总和为i的选法个数intcombinationSum4(vector<int>&nums,inttarget){intn=nums.size();f[0]=1;for(inti=0;i<=target;i++)for(intj=0;j<n;j++)......
  • Codeforces Beta Round 96 (Div. 1) -- C. Logo Turtle (dp,记忆化搜索)
    记忆化搜索就是暴力,多一步优化,走过的路别走了。说实话,可能是数据水了,居然能过。constintN=510;strings;intn,ans;boolst[501][501][2][50];voiddfs(intx,intidx,intdir,intk){ if(st[x][idx][dir][k])return; st[x][idx][dir][k]=1;//走过的路不走......
  • COMP2212编程概念
    COMP2212ProgrammingLanguageConceptsCourseworkIntroductionInthiscourseworkyouarerequiredtodesignandimplementadomainspecificprogramminglanguageforspecifyingtilingpatterns.Forthepurposesofthisassignmentweconsideratiletobeasq......
  • [Leetcode]找出链表公共结点
    力扣链接思路:先求出两个链表的长度差长链表先走差距步同时走,第一个地址相同的是交点代码:/***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*getIntersectionNode(structListNode*he......
  • leetcode-217-存在重复元素 题解
    题目描述给你一个整数数组nums。如果任一值在数组中出现至少两次,返回true;如果数组中每个元素互不相同,返回false。示例1:输入:nums=[1,2,3,1]输出:true示例2:输入:nums=[1,2,3,4]输出:false示例3:输入:nums=[1,1,1,3,3,4,3,2,4,2]输出:true提......
  • Educational Codeforces Round 39 (Rated for Div. 2) -- D. Timetable (DP)
    写得很折磨人,每次dp都写个一个多小时,写出来明明觉得不难.题目大意:可以进行K次操作,把删除1,进行k次操作后每行第一个1和最后一个1的位置相减的绝对值加1得到的结果最小。做法:每次肯定是要从左删或者从右边删,然后顺着这个思路,先把每行的进行小于等于k次操作时,每行最小......
  • codeforces 559C Gerald and Giant Chess(dp+组合数学)
    题目链接:codeforces559C题目大意:给出一个h*r的矩阵,从左上角走到右下角,中间有一些点不能经过,问不同的路径有多少种?题目分析:首先我们考虑一个n*m的矩阵,从左上角只能向右或向下走能走到右下角的方案数,也就是C(n+m,n),就是一共要走n+m次,选出n次横着走。那么我们定义dp[i]表示在前不经......
  • codeforces 545C C. Woodcutters(dp+二分)
    题目链接:codeforces545C题目大意:给出一些树的位置和高度,每棵树可以砍倒,覆盖[xi−hi,xi]或者覆盖[xi,xi+hi],或者不砍倒,问最多砍倒多少棵树?题目分析:我们记录dp[i]表示选取到i棵树的时候用的最短的区间长度。每次枚举每棵树,二分到最大的不超过当前树位置的个数,然后利用当前树的信息......