求助高手,一个矩阵相关的问题

Arthas102 2010-10-27 11:39:31
给定一个N*N的矩阵,N>=1,矩阵的元素全部都是0或者1,现在需要把矩阵中,元素全部为1的最大的子矩阵求出来,例如:
0 0 1 1 0 0
0 0 1 1 1 1
0 0 1 1 1 0
0 0 1 1 1 0
0 0 1 0 0 0

所求的结果就应该是(左上角为(0,0))
(2,1)和(3,3)这个子矩阵
...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
donkey301 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 litaoye 的回复:]

mysword牛曾说过,解决这个问题,可以采用极大化的方法,网上有资料,题目是一模一样的,lz搜索一下!
[/Quote]
这个还是很精妙的
http://blog.csdn.net/mysword/archive/2010/01/28/5267531.aspx
C1053710211 2010-10-27
  • 打赏
  • 举报
回复
动态规划

// 2000-Maximum Submatrix.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
const int MAX=128;
int DL[MAX][MAX], DR[MAX][MAX], H[MAX][MAX],HL[MAX][MAX],HR[MAX][MAX];
int v[MAX][MAX];

int max(int x, int y)
{
return x>y?x:y;
}
int min(int x, int y)
{
return x<y?x:y;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,N,M,ans;
int t,ansx,ansy;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&N,&M);
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
scanf("%d",&v[i][j]);
memset(H,0,sizeof(H));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==1) H[i][j]=H[i-1][j]+1;
else H[i][j]=0;
}
memset(HL,0,sizeof(HL));
for(j=1;j<=M;j++)
for(i=1;i<=N;i++)
{
if(v[i][j]==1) HL[i][j]=HL[i][j-1]+1;
else HL[i][j]=0;
}
memset(HR,0,sizeof(HR));
for(j=M;j>=1;j--)
for(i=1;i<=N;i++)
{
if(v[i][j]==1) HR[i][j]=HR[i][j+1]+1;
else HR[i][j]=0;
}
memset(DL,0,sizeof(DL));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==0) DL[i][j]=0;
else
{
if(H[i][j]==1) DL[i][j]=HL[i][j];
else DL[i][j]=min(DL[i-1][j],HL[i][j]);
}
}
memset(DR,0,sizeof(DR));
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
if(v[i][j]==0) DR[i][j]=0;
else
{
if(H[i][j]==1) DR[i][j]=HR[i][j];
else DR[i][j]=min(DR[i-1][j],HR[i][j]);
}
}
ans=0;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
if(v[i][j]==1)
{
if(ans<max(ans,H[i][j]*(DR[i][j]+DL[i][j]-1)))
{
ans=max(ans,H[i][j]*(DR[i][j]+DL[i][j]-1));
ansx = i;
ansy = j;
}
}
printf("%d (%d,%d) (%d,%d)\n",ans,ansy-H[ansx][ansy],ansx-ans/H[ansx][ansy],ansy-1,ansx-1);
}
return 0;
}
boxxPCP 2010-10-27
  • 打赏
  • 举报
回复
现在正在看矩阵
绿色夹克衫 2010-10-27
  • 打赏
  • 举报
回复
mysword牛曾说过,解决这个问题,可以采用极大化的方法,网上有资料,题目是一模一样的,lz搜索一下!

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧