学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
给定一个
n
×
m
n\times m
n×m的二维网格, 每一个网格中都有一个非负整数
a
i
,
j
a_{i,j}
ai,j。我们定义
a
i
,
j
a_{i,j}
ai,j的“X型和”为
a
i
,
j
a_{i,j}
ai,j所在的主对角线和副对角线所有元素总和。
请你计算在二维网格中所有位置上的“X型和”的最大值。
【输入】
一行,两个正整数
n
,
m
n,m
n,m;
接下来
n
n
n行, 每行
m
m
m个整数, 其中第
i
i
i行的第
j
j
j个元素为
a
i
,
j
a_{i,j}
ai,j。
【输出】
一行,一个整数,表示二维网格中所有位置上的“X型和”的最大值。
【输入样例】
3 3
0 1 1
1 0 1
1 1 0
【输出样例】
3
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n, m, a[2010][2010], s1[4010], s2[4010];
int main()
{
cin >> n >> m;
for (int i=1; i<=n; i++) { // 输入二维矩阵
for (int j=1; j<=m; j++) {
cin >> a[i][j];
}
}
for (int i=1; i<=n; i++) { // 预处理数据
for (int j=1; j<=m; j++) {
s1[i+j] += a[i][j]; // 计算副对角线之和
s2[j-i+2000] += a[i][j]; // 计算主对角线之和,因为下标会为负数,所以需要加上2000
}
}
int ans = -1;
for (int i=1; i<=n; i++) { // 遍历每个单元格
for (int j=1; j<=m; j++) {
ans = max(ans, s1[i+j] + s2[j-i+2000] - a[i][j]); // 计算主副对角线之和,并求最大值
}
}
cout << ans << endl; // 输出结果
return 0;
}
【运行结果】
3 3
0 1 1
1 0 1
1 1 0
3