[編程題]最大和
輸入描述:
每個測試輸入包含1個測試用例,第一行包括兩個整數 N 和 D : 3 <= N <= 100 1 <= D <= N 接下來有N行,每行N個數字d: 0 <= d <= 100
輸出描述:
輸出一個整數,表示找到的和的最大值
輸入
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;
}