c题目输入是nm的01矩阵要求找到其中最

2021-03-07 17:24:47 字数 2119 阅读 9953

1楼:匿名用户

你**贴全了吗?

为什么下面的函数在里主函数里都没有调用?

用你现在的程序虽然能过例子但是

给你个测试数据:

4 30 0 0

0 0 0

1 1 1

1 1 1

就有错误了~!

2楼:匿名用户

这种问题最好把自己的思路说下,不然没人能看懂你的**。

你这样做肯定是不对的,这个题其实就是最大子矩阵,只不过把0的权设为1,1的权设为负无穷,这样求出来的肯定是最大的全是0的矩阵,仔细看一下我得做法,用的是动态规划。

顺便问下你去**交的题?我也去看下

#include

const int max_int = 0xfffffff;

int map[ 301 ][ 301 ], opt[ 301 ], n, m, maxn;

void init( )

maxn = 0;

}void work( )}}

void print( )

int main( )

3楼:匿名用户

对每个0元素定义其极大扩展矩阵

为按以下方法构造的矩阵:先向上扩展,直到遇到1或边界,然后以刚刚得到的边为基准向左右扩展,直到遇到1而不能扩展。

比如1 0

0 0中右下角的0的极大扩展矩阵为最右边的一列,比如

1 0 0 0

0 0 0 1

0 0 0 0

中第二行左数第二列的0的极大扩展矩阵为第

一、二行中间的4个0。

可以证明最大的全0矩阵必为某个0元素的极大扩展矩阵:最大的全0矩阵(设为a)最上边必定有一些1或边界而导致这个矩阵不能再向上扩展,那么在有1或边界的列上,a中最下面一行的元素的极大扩展矩阵即为a。

比如1 0

0 0中右下角的0的极大扩展矩阵即为一个最大全0矩阵,比如

1 0 0 0

0 0 0 1

0 0 0 0

中第三行中间两个0的极大扩展矩阵均为最大全0矩阵。

因此我们可以通过遍历每个0元素的极大扩展矩阵来求得最大全0矩阵。对每个元素保存l,r,h三个值,分别表示从该元素到其极大扩展矩阵最左边一列的的距离、从该元素到其极大扩展矩阵最右边一列的的距离、极大扩展矩阵的高度,可以通过递推求得:

如果[i,j](表示从上往下数第i行、从左往右数第j列的元素,下同)=0,那么

l[i+1,j]=min,

r[i+1,j]=min,

h[i+1,j]=h[i,j]+1,

否则l[i+1,j]=从[i,j]到左边第一个1的距离,

r[i+1,j]=从[i,j]到右边第一个1的距离,

h[i+1,j]=1。

最后只需要找出所有元素中(l+r+1)h最大的即可。它的极大扩展矩阵即为最大全0矩阵。

4楼:宋戈

using namespace std;

bool check(int,int,int);

int trr(int,int,int);

int a[301][301],n;

int main()

if (x>0) k=trr(i,j-x,j-1);

if (k>max) max=k;

while(a[i][j]==1&&j<=m) j++;

}while(j<=m);

} cout<1&&ans)

t=aa;ans=true;

while(t给你个测试数据:

4 30 0 0

0 0 0

1 1 1

1 1 1

就有错误了~!#include

const int max_int = 0xfffffff;

int map[ 301 ][ 301 ], opt[ 301 ], n, m, maxn;

void init( )

maxn = 0;

} void work( ) }

} void print( )

int main( )

{ init( );

work( );

print( );

return 0;