最大正方形 dp解法

在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。

 1 var
 2   n,m,i,j,max:longint;
 3   a:array[1..100,1..100]of longint;
 4   f:array[0..100,0..100]of longint;
 5 function min(x,y,z:longint):longint;
 6 begin
 7   if x<y then
 8   if z<x then exit(z) else exit(x)
 9   else
10   if z<y then exit(z) else exit(y);
11 end;
12 begin
13   readln(m,n);
14   for i:=1 to m do
15   for j:=1 to n do
16   read(a[i,j]);
17
18   for i:=1 to m do
19   for j:=1 to n do
20   begin
21     if a[i,j]=0 then continue;
22     f[i,j]:=min(f[i-1,j],f[i,j-1],f[i-1,j-1])+1;
23   end;
24   for i:=1 to m do
25   for j:=1 to n do
26   if f[i,j]>max then max:=f[i,j];
27   writeln(max);
28 end.

思想:以i,j为右下角矩形的最大边长取决于f[i-1,j],f[i,j-1],f[i-1,j-1]

时间: 2024-11-02 06:24:12

最大正方形 dp解法的相关文章

neu1458 方格取数 dp解法

题意: 有N * N个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次. 走两次,所以状态表示要同时表示两次路径.dp[i][j][k][l] 表示第一次走到i,  j,第二次走到k, l得到的最大值,这里i + j == k + l 其实第四维是可以通过前三维算出来的,所以可以去掉 那么dp[i][j][k] 可以通过四种状

計蒜客/數正方形(dp)

題目鏈接:https://nanti.jisuanke.com/t/44 題意:中文題誒~ 思路: 用dp[i][j]存儲以(i, j)爲左上定點的最大正方形變長,從右下角網左上角一次計算所有頂點: 通過畫圖不難分析出動態專題方程式爲: dp[i][j]=min(dp[i+1][j+1], dp[i+1][j], dp[i][j+1]) + 1 需要注意的是如何累計所有變長的正方形數目, 對於坐標(i, j), 從2~dp[i][j]依次累加一次即可: 代碼: 1 #include <iostr

小明的密码-初级DP解法

#include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009]; // M N num num即M-1位的数字 int num_2[7]= {2,3,5,7,11,13,17}; int num_3[9]= {2,3,5,7,11,13,17,19,23}; int num_4[11]= {2,3,5,7,11,13,17,19,23,29,31}; //存储

航空路线问题(dp解法)

题目链接:https://www.luogu.org/problemnew/show/P2770 题意: 从左到右给你n个点,有m条边连接这些点,问从最左边的点到达最右边的点再回到最左边的点最多可以经过几个点(除了起点外每个点最多只能被经过一次). 题解: 首先,我们可以把题意转化成从最左边的点走两条不相交的路线到达最右边的点,且使经过的点最多.标程是最大费用最大流. 为了限流,我们把每个点i拆成两个点xi,yi,x1->y1.xn->yn连一条容量为2,费用为1的边,其他点xi->yi

[LeetCode] 221. 最大正方形(DP)

题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximal-square 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 dp[i][j] 表示以matrix[i-1][j-1]为右下角的最大正方形的边长 转移方

CF #610Div2 B2.K for the Price of One (Hard Version) (dp解法 &amp;&amp; 贪心解法)

题目大意:刚开始有 p 块钱,商店有 n 件物品,你每次可以只买一件付那一件的钱,也可以买 k 件只付最贵那件的钱,问你最多能买几件 (k<=n<=2e5) 首先我们要明确,如果你买了这一件商品,那么你一定买了比这件商品价格低的所有商品,因为这样买花的钱才会更少,方法才是最优的. 解法一:这道题用 背包dp 解应该是最直观的,先排序一下,状态要么由前一件转移过来,要么由前 k 件转移过来,即 dp[i] = min(dp[i-1]+a[i],dp[i-k]+a[i])然后我们只要找到买哪一件之

hustwinterC - Happy Matt Friends(dp解法)

Description Matt has N friends. They are playing a game together. Each of Matt’s friends has a magic number. In the game, Matt selects some (could be zero) of his friends. If the xor (exclusive-or) sum of the selected friends’magic numbers is no less

[POJ 3311]Hie with the Pie——再谈TSP问题的DP解法

题目连接:  http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 思路:用二进制数来表示访问过的城市集合,f[{S}][j]=已经访问过的城市集合为S,访问了j个城市,所需的最少花费. 这里提一下二进制数表示集合的方法(这里不妨设集合中最多有n个元素): 如果集合S中最多会出现n个元素,则用长度为n的二进制数来表示集合S,每一位代表一个元素,该位为0表示该元素在集合S中不存在,为1表示该元素在集

HDU 5389 Zero Escape(dp解法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 题面: Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 164    Accepted Submission(s): 73 Problem Description Zero Escape, is a vis