My coding way (5)

来源:互联网 发布:域名怎么管理 编辑:程序博客网 时间:2024/04/23 23:53

问题 D:最大子矩阵

时间限制:1 Sec  内存限制:128 MB

题目描述

有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是1 x 1或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。本题中,把具有最大和的子矩阵称为最大子矩阵。

例如,如下数组的最大子矩阵位于左下角,

 0 -2-7  0

 9  2-6  2

-4  1-4  1

-1  8 0 -2

最大子矩阵为

 9  2

-4  1

-1  8

其和为15

输入

第一行是一个测试数据的个数T,表示将会有T组测试数据。下一行输入一个正整数N,表示二维方阵的大小。接下来是N2个整数(由空格和换行隔开)。该数组的N2个整数,是以行序给出的。也就是,先是第一行的数,由左到右;然后是第二行的数,由左到右,等等。N可能达到100,数组元素的范围是[-127,127]

输出

与测试数据对应,刚好有T行,每行输出最大子矩阵的和。

样例输入

2

4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2

3

3 9 -5

-9 4 -2

3 6 -7

样例输出

15

19

 

其实一开始让我做这道题我是拒绝的= = 因为第一次看这道题真的是浑身发抖ww 后来发现这道题和之前的那个矩阵思路差不多w

 

#include <stdio.h>#include <stdlib.h>#include <string.h> int map[110][110];int maxofmap;int findinmap(int l,int h,int max){    int i,j,p,q;    int state=-1;    int maxans;    int tmp;    for(i=0;i<max-l+1;i++)    {        for(j=0;j<max-h+1;j++)        {            tmp=0;            for(p=0;p<l;p++)            {                for(q=0;q<h;q++)                {                    tmp+=map[1+p+i][1+q+j];                }            }            if(state<0)            {                state++;                maxans=tmp;            }            else if(tmp>maxans)            {                maxans=tmp;            }        }    }    return maxans;}void deal(int max){    int l,h,tmp;    for(l=1;l<=max;l++)    {        for(h=1;h<max;h++)        {            if((tmp=findinmap(l,h,max))>maxofmap)            {                maxofmap=tmp;            }        }    }    printf("%d\n",maxofmap);}  int main(){    int all,n,i,j;    scanf("%d",&all);    for(;all>0;all--)    {        scanf("%d",&n);        memset(map,0,sizeof(int)*110*110);        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                scanf("%d",&map[i][j]);            }        }        maxofmap=map[1][1];        deal(n);    }    return 0;}


0 0
原创粉丝点击