解题思路:

1.设一个足够大的二维数组

2.从[1][1]开始向右下累加,使每个位置表示其左上方(包括该位置本身的数)的和

3.四重for循环(前两重与后两重代表两个指针,指示矩阵的左上角和右下角)

4.利用累加好的数组减去矩阵外的数的总和
5.逐个比较得到最大值
注意事项:
*最关键一步在于得到每个子矩阵的具体大小,在减去子矩阵外的总值时,分别减去sum[i-1][t]和sum[k][j-1]位置的值,

但其中已包含了两遍sum[i-1][j-1]位置的值(即该两数值重合累加的部分),因此要加回一次sum[i-1][j-1],这是关键!

参考代码:

#include

using namespace std;

int N,a[105][105],sum[105][105];

int main()

{

    cin>>N;

    for(int i=1;i<=N;i++)

    {

        for(int j=1;j<=N;j++)

        {

             cin>>sum[i][j];

        }

    }

    for(int i=1;i<=N;i++)

   {

        for(int j=1;j<=N;j++)

        {

             sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];

        }

   }

    int a,b,c,d;

int maxi=-999999;

for(int i=1;i<=N;i++)

{

for(int j=1;j<=N;j++)

{

for(int k=i;k<=N;k++)

{

for(int t=j;t<=N;t++)

{

//maxi=max(maxi,sum[k][t]-sum[i-1][t]-sum[k][j-1]+sum[i-1][j-1]);

if(maxi<sum[k][t]-sum[i-1][t]-sum[k][j-1]+sum[i-1][j-1])

    {

        maxi=sum[k][t]-sum[i-1][t]-sum[k][j-1]+sum[i-1][j-1];

        a=i,b=j,c=k,d=t;

    }

}

}

}

}

cout<<maxi;

// cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;

return 0; 

}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论