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;