hdu4846 最大子正方形(dp)
来源:互联网 发布:2016淘宝刷单还有用吗 编辑:程序博客网 时间:2024/05/14 17:13
题意:
给你一个图,让你找到最大的子矩形。
思路:
{
for(j = 1 ;j <= n ;j ++)
map[i][j] == '.' ? sum[j] ++ : sum[j] = 0;//更新当前点上面有多少个连续1
//更新当前点左边连续大于的最远
L[1] = 1;
for(j = 2 ;j <= n ;j ++)
{
int k = j;
while(k > 1 && sum[j] <= sum[k-1]) k = L[k-1];
L[j] = k;
}
//更新当前点右边连续大于的最远
R[1] = n;
for(j = n - 1 ;j >= 1 ;j --)
{
int k = j;
while(k > 1 && sum[j] <= sum[k+1]) k = R[k+1];
R[j] = k;
}
// 更新答案
for(j = 1 ;j <= n ;j ++)
{
int now = min(R[j] - L[j] + 1 ,sum[j]);
if(ans < now) ans = now;
}
}
给你一个图,让你找到最大的子矩形。
思路:
之前做过一个最大子矩阵,记得当时是用三种方法做的,两种都是瓶颈法,第三种是dp,结果今天的用瓶颈吧怎么都过不去,哎!不知道为什么,后来没办法有写了和dp顺利ac了,我们求最大子矩阵的时候是记录最大的长*宽,这次只要记录最大的min(长,宽),就行了,说下这个题目的dp做法吧,只要是开三个数组,L[],R[],sum[],sum是记录当前点的上面有多少个连续的1,L是记录当前点sum大于等于左边的最远的那个数的下标(连续大于),R则是又边,则我们可以一边更新sum一边更新L,R和ans,主要核心如下
{
for(j = 1 ;j <= n ;j ++)
map[i][j] == '.' ? sum[j] ++ : sum[j] = 0;//更新当前点上面有多少个连续1
//更新当前点左边连续大于的最远
L[1] = 1;
for(j = 2 ;j <= n ;j ++)
{
int k = j;
while(k > 1 && sum[j] <= sum[k-1]) k = L[k-1];
L[j] = k;
}
//更新当前点右边连续大于的最远
R[1] = n;
for(j = n - 1 ;j >= 1 ;j --)
{
int k = j;
while(k > 1 && sum[j] <= sum[k+1]) k = R[k+1];
R[j] = k;
}
// 更新答案
for(j = 1 ;j <= n ;j ++)
{
int now = min(R[j] - L[j] + 1 ,sum[j]);
if(ans < now) ans = now;
}
}
ok核心就是这些,时间复杂度是O(n^2)
#include<stdio.h>#include<string.h>int L[1111] ,R[1111] ,sum[1000];int map[1111][1111];int minn(int x ,int y){ return x < y ? x : y;}int main (){ int n ,m ,i ,j; int ans ,x ,y; while(~scanf("%d %d" ,&n ,&m)) { memset(map ,255 ,sizeof(map)); memset(sum ,0 ,sizeof(sum)); while(m--) { scanf("%d %d" ,&x ,&y); map[x][y] = 0; } for(ans = 0 ,i = 1 ;i <= n ;i ++) { for(j = 1 ;j <= n ;j ++) map[i][j] ? sum[j] ++ : sum[j] = 0; L[1] = 1; for(j = 2 ;j <= n ;j ++) { int k = j; while(k > 1 && sum[j] <= sum[k-1]) k = L[k-1]; L[j] = k; } R[n] = n; for(j = n - 1 ;j >= 1 ;j --) { int k = j; while(k < n && sum[j] <= sum[k+1]) k = R[k+1]; R[j] = k; } for(j = 1 ;j <= n ;j ++) { int now = minn(R[j] - L[j] + 1 ,sum[j]); if(ans < now) ans = now; } } printf("%d\n" ,ans); } return 0;}
0 0
- hdu4846 最大子正方形(dp)
- dp 最大全1子正方形
- LeetCode 221 Maximal Square (最大子正方形 dp)
- 最大子正方形
- 最大正方形子矩阵
- HDU4846->区间DP
- 最大正方形 DP
- rqnoj 618 最大子正方形
- 2163 最大正方形子矩阵
- hdu 4846 最大子正方形
- [dp][二分答案]最大正方形
- [DP] Luogu1681 最大正方形II
- 最大子正方形 (!) 动态规划
- wikioi 1259 最大正方形子矩阵
- vojos 1055,1057 最大子矩阵、正方形
- 最大正方形问题(DP)套路
- DP最大子序列
- 最大子矩阵 (DP)
- Thinkpad E431 解决无线网卡无法开启
- 杂音 & pop 音的解决方法
- FPGA 异步时钟处理方
- (转)女生适不适合当程序员?
- 2014 Multi-University Training Contest 1
- hdu4846 最大子正方形(dp)
- vs2003 调试器失效的解决方法 .
- 编译U-boot 出现Nothing to be done for `_depend'.错误
- error:Cannot create file when that file already exists_
- Eclipse,到了说再见的时候了——Android Studio最全解析
- 云计算 hadoop spark学习资料整理 百度网盘
- 20140524软考总结
- 矩形嵌套--动态规划--最长递增子序列问题变形
- 证书认证失败问题