解题思路:
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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复