c语言:输入是一个n*m的矩阵,要求找到其中最大的全0字矩阵。怎么算?

全零子矩阵
看不太懂啊。我觉着楼下两位算法好像有问题啊。
能不能详细解释下?

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

#include <cstdio>

const int Max_Int = 0xfffffff;

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

void init( )
{
int i, j, t;
scanf("%d%d", &n, &m);
for ( i = 0; i < n; i++ )
for ( j = 0; j < m; j++ )
{
scanf("%d", &t);
if ( t == 0 )
map[ i ][ j ] = 1;
else
map[ i ][ j ] = -Max_Int;
}
maxn = 0;
}

void work( )
{
int i, j, k, t;
for ( i = 0; i < n; i++ )
for ( j = i; j < n; j++ )
{
t = 0;
for ( k = 0; k < m; k++ )
{
if ( j == i )
opt[ k ] = map[ i ][ k ];
else
opt[ k ] += map[ j ][ k ];
t += opt[ k ];
if ( t < 0 )
t = 0;
if ( maxn < t )
maxn = t;
}
}
}

void print( )
{
printf("%d", maxn);
}

int main( )
{
init( );
work( );
print( );
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-12-29
这个题其实就是最大子矩阵,只不过把0的权设为1,其他的权设为负无穷,这样求出来的肯定是最大的全是0的矩阵,仔细看一下我得做法,用的是动态规划。
#include
<cstdio>
const
int
Max_Int
=
0xfffffff;
int
map[
301
][
301
],
opt[
301
],
n,
m,
maxn;
void
init(
)
{
int
i,
j,
t;
scanf("%d%d",
&n,
&m);
for
(
i
=
0;
i
<
n;
i++
)
for
(
j
=
0;
j
<
m;
j++
)
{
scanf("%d",
&t);
if
(
t
==
0
)
map[
i
][
j
]
=
1;
else
map[
i
][
j
]
=
-Max_Int;
}
maxn
=
0;
}
void
work(
)
{
int
i,
j,
k,
t;
for
(
i
=
0;
i
<
n;
i++
)
for
(
j
=
i;
j
<
n;
j++
)
{
t
=
0;
for
(
k
=
0;
k
<
m;
k++
)
{
if
(
j
==
i
)
opt[
k
]
=
map[
i
][
k
];
else
opt[
k
]
+=
map[
j
][
k
];
t
+=
opt[
k
];
if
(
t
<
0
)
t
=
0;
if
(
maxn
<
t
)
maxn
=
t;
}
}
}
void
print(
)
{
printf("%d",
maxn);
}
int
main(
)
{
init(
);
work(
);
print(
);
return
0;
}
第2个回答  2007-11-15
说一下算法:
---------------------
[i,j]从[0,0]-->[n][m]循环
{{//循环开始
if([i][j]==0)
{
//纵向判断
k=0
while([i+k][j]==0)k++;
a=k;
//横向判断
k=0;
while([i][j+k]==0)k++;
b=k;
//保存找到的子矩阵
save(i,j,a,b);//[i,j]开始,a行b列子矩阵,可以保存到一个结构数组,或者链表
}//if结束
}}//循环结束

从保存的结构数组(或者链表)中挑出最大的一个输出
--------------------------------------------
关于最大:用元素多少比较
比如:2行3列的矩阵 比 1行7列矩阵小

c语言:输入是一个n*m的矩阵,要求找到其中最大的全0字矩阵。怎么算?
int map[ 301 ][ 301 ], opt[ 301 ], n, m, maxn;void init( ){ int i, j, t;scanf("%d%d", &n, &m);for ( i = 0; i < n; i++ )for ( j = 0; j < m; j++ ){ scanf("%d", &t);if ( t == 0 )map[ i ][ j ] = 1;else map[ i ][ j ] =...

c++题目 输入是一个n*m的01矩阵,要求找到其中最大的全0字矩阵
int map[ 301 ][ 301 ], opt[ 301 ], n, m, maxn;void init( ){ int i, j, t;scanf("%d%d", &n, &m);for ( i = 0; i < n; i++ )for ( j = 0; j < m; j++ ){ scanf("%d", &t);if ( t == 0 )map[ i ][ j ] = 1;else map[ i ][ j ] =...

有一个N*M的矩阵,要求编程求出其中值最大的那个元素,以及其所在的行号和...
int main(){ int a[100][100];int i,j,n,m,max,maxi,maxj;printf("请输入N,M\\n");scanf("%d%d",&n,&m);printf("请输入矩阵:\\n");for(i=0;i<n;i++){ for(j=0;j<m;j++)scanf("%d",&a[i][j]);} max=a[0][0];for(i=0;i<n;i++){ for(j=0;j<m;j+...

C语言:有一个m*n矩阵,求出其最大值并输出。
include <stdio.h>void main(){int i,j,m,n,max,a[100][100];scanf("%d%d",&m,&n);for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);max=a[0][0];for(i=0;i<m;i++)for(j=0;j<n;j++)if(max...

有一个M×N阶矩阵,求其中最大值和最小值,以及它们的行号和列号。用C...
include<stdio.h>int main(){int m,n,i,j,maxi,maxj,mini,minj; scanf("%d%d",&m,&n); int a[m][n]; maxi=maxj=mini=minj=0; for(i=0;i<m;i++) for(j=0;j<n;j++) {scanf("%d",&a[i][j]); if(a[i][j]>a[maxi][maxj]){maxi=i;maxj=j;} if...

1.有一个M×N的矩阵,编写程序,找出其中最大的那个元素所在的行和列...
y = Val(InputBox("输入列数", "计算矩阵"))ReDim jz(0 To x - 1, 0 To y - 1)'输入数据 For i = 0 To x - 1 Step 1 For t = 0 To y - 1 Step 1 jz(i, t) = Val(InputBox("输入行数为" & CStr(i + 1) & ",列数为" & CStr(t + 1) & "的元素", "...

C语言编程:输入一个M*N的整数矩阵,求其最大值及其所在的行号、列号...
printf("请输入该%d*%d矩阵:\\n",m,n);for(i=0;i<m*n;i++)scanf("%d",&array[i]);int max=array[0];int index=0;for(i=1;i<m*n;i++){ if(max<array[i]){ max=array[i];index=i;} } printf("您输入的矩阵中的最大值为:%d\\n",max);printf("它所在的行号和列号...

一个M*N的矩阵,元素取值1或0,问如何找到最大的矩阵,其所有的元素都为0...
在一个n*m的只包含0和1的矩阵里找出一个不包含1的最大正方形,输出边长。输入格式:输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.输出格式:一个整数,最大正方形的边长 输入样例 5 5 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 ...

求试题,17届NOIP(C语言)普及组初赛试题
B. 程序运行时理论上所占的数组空间 C. 程序运行时理论上所占的硬盘空间 D. 程序源文件理论上所占的硬盘空间 13.在含有n个元素的双向链表中查询是否存在关键字为k的元素,最坏情况下运行的时间复杂度是( )。 A. O(1) B. O(log n) C. O(n) D. O(n log n) 14.生物特征识别,是利用人体本身...

C语言,输入一个矩阵,找出所在行上最大,列上最小的数。(可能没有) 可 ...
以下是求每一行上最大、每一列上最小的程序:#include<stdio.h>main(){int i,j,k,l,min,max;printf("请输入矩阵的规格:\\n");scanf("%d,%d",&i,&j);printf("这是一个%d乘%d的矩阵\\n",i,j);int a[i][j];printf("请输入该矩阵:\\n");for(k=0;k<i;k++)for(l=0;l<j;...

相似回答