[編程題]最大和

[編程題]最大和

在一個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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章