[编程题]最大和
在一个N*N的数组中寻找所有横,竖,左上到右下,右上到左下,四种方向的直线连续D个数字的和里面最大的值
输入描述:
每个测试输入包含1个测试用例,第一行包括两个整数 N 和 D : 3 <= N <= 100 1 <= D <= N 接下来有N行,每行N个数字d: 0 <= d <= 100
输出描述:
输出一个整数,表示找到的和的最大值
示例1
输入
4 2 87 98 79 61 10 27 95 70 20 64 73 29 71 65 15 0
输出
193
思路
暴力一通,注意单独处理右上到左下,考虑连续D
个元素问题,小于D
个元素不计算。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, d;
cin>> n>> d;
vector<vector<int>> v(n, vector<int> (n));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j)
cin>> v[i][j];
}
long long allSum = LONG_MIN;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j){
long long sum = 0;
for (int x = 0; x < d; x++){
if (x+j >= n) break;
sum += v[i][x+j];
}
allSum = max(sum, allSum);
sum = 0;
for (int x = 0; x < d; x++){
if (x+i >= n) break;
sum += v[i+x][j];
}
allSum = max(sum, allSum);
sum = 0;
for (int x = 0; x < d; x++){
if (x+j >= n || x+i >= n) break;
sum += v[x+i][x+j];
}
allSum = max(sum, allSum);
}
}
// 单独处理右上到左下
for (int i = 0; i < n-d+1; ++i) {
for (int j = n-1; j >= 0; --j){
long long sum = 0;
for (int x = 0; x < d; x++){
if (j-x < 0 || i+x >= n) break;
sum += v[i+x][j-x];
}
allSum = max(sum, allSum);
}
}
cout<< allSum;
return 0;
}