最大子矩阵(C语言)

P1250 最大子矩阵

描述

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×11×1)子矩阵。

比如,如下4×4的矩阵

  0  -2   -7   0

  9   2   -6   2 

-4    1   -4   1

-1    8    0  -2

的最大子矩阵是

  9   2

-4   1

-1   8

这个子矩阵的大小是15。

格式

输入格式

输入是一个N×N的矩阵。输入的第一行给出N(0

输出格式

输出最大子矩阵的大小。

样例

输入样例

4
0 -2 -7  0
9  2 -6  2
-4  1 -4  1
-1  8  0 -2

输出样例

15

#include<stdio.h>
int main()
{
	int begin,end,bi,bj;
    int n;
    int i,j,k,z; 
    int a[101][101];
    scanf("%d",&n);
        int max=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++){
                scanf("%d",&a[i][j]);
            }
        } 
        for(int i=1;i<=n;i++){
            for(int j=i;j<=n;j++){
                int temp[101]={0};
                int d[101]={0};
                for(int z=1;z<=n;z++){
                    for(int k=i;k<=j;k++)
                    {
                        temp[z]+=a[k][z];
                    }
                }

                for(int x=1;x<=n;x++)
                {
                    d[x]=temp[x];
                    if(d[x-1]>0)
                        d[x]=d[x-1]+temp[x];
                    if(max<d[x]){
                    	if(d[x-1]<=0){
                    		begin=x;
						}
                        max=d[x];
                        end=x;
                        bi=i;bj=j;
                    }
                }
            }
        }
      for(i=bi;i<=bj;i++){
      	for(j=begin;j<=end;j++){
      		printf("%d ",a[i][j]);
		  }
		  printf("\n");
	  }
      printf("%d",max);
    return 0;
}

 


版权声明:本文为wyx9475原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。