簡體   English   中英

給定2D數組的連續子數組中的最大和

[英]Maximum sum in a contiguous subarray of a given 2D array

我已經解決了這個問題,但是所有給出的解釋都是針對DP解決方案,其復雜度至少為N ^ 3。 我已經在N ^ 2中解決了這個問題,我想知道我的解決方案是否錯誤。

我們給定了一個二維整數數組(+ ve和-ve),我們兩個發現該數組的子數組具有最大可能的和。

我使用的算法是修復4個索引。 對於2列,我從0到N跨度以找出最大和出現的位置,然后從N到0跨度。從這兩個結果中,我推斷出從哪一列到哪一和將是最大。 我對行使用相同的方法。 一次,我得到了4個索引,就完成了。 復雜度:O(N ^ 2)

這是我的代碼:

#include <iostream>

using namespace std;

template<size_t n>
int find_col_sum(int A[][n], int m, int r1, int r2, int c) {
    int sum = 0;
    for (int i = r1; i <= r2; i++)
        sum += A[i][c];
    return sum;
}
template<size_t n>
int find_row_sum(int A[][n], int m, int c1, int c2, int r) {
    int sum = 0;
    for (int i = c1; i <= c2; i++)
        sum += A[r][i];
    return sum;
}

template<size_t n>
void max_sum_array(int A[][n], int m, int &i1, int &i2, int &i3, int &i4) {
    int mx1 = 0, mx2 = 0;
    int sum = 0, max1_sum = 0;
    int max2_sum = 0;

    //0 to col
    for (int i = 0; i < n; i++) {
        sum += find_col_sum(A,m,0,n-1,i);
        if (sum > max1_sum) {
            mx1 = i;
            max1_sum = sum;
        }
    }
    //n-1 to col
    sum = 0; mx2 = n-1;
    for (int i = n-1; i >= 0; i--) {
        sum += find_col_sum(A,m,0,n-1,i);
        if (sum > max2_sum) {
            mx2 = i;
            max2_sum = sum;
        }
    }
    if (mx1 <= mx2) {
        if (max1_sum >= max2_sum) {
            mx2 = mx1; mx1 = 0;
        }
        else {
            mx1 = mx2; mx2 = n-1;
        }
    }
    else
        swap(mx1,mx2);
    i1 = mx1; i2 = mx2;
    mx1 = 0; mx2 = m-1;
    max1_sum = 0; max2_sum = 0;
    sum = 0;
    //0 to row
    for (int i = 0; i < m; i++) {
        sum += find_row_sum(A,m,i1,i2,i);
        if (sum > max1_sum) {
            mx1 = i;
            max1_sum = sum;
        }
    }
    sum = 0;
    //m-1 to row
    for (int i = m-1; i >= 0; i--) {
        sum += find_row_sum(A,m,i1,i2,i);
        if (sum > max2_sum) {
            mx2 = i;
            max2_sum = sum;
        }
    }
    if (mx1 <= mx2) {
        if (max1_sum >= max2_sum) {
            mx2 = mx1; mx1 = 0;
        }
        else {
            mx1 = mx2; mx2 = m-1;
        }
    } else
        swap(mx1,mx2);
    i3 = mx1; i4 = mx2;
}

int main() {
    int A[][4] = {{0,-2,-7,0},{9,2,-6,2},{-4,1-4,1},{-1,8,0,-2}};
    int i1 = 0, i2 = 0, i3 = 0, i4 = 0;

    max_sum_array(A,4,i1,i2,i3,i4);
    cout<<i1<<" "<<i2<<" "<<i3<<" "<<i4<<endl;

    return 0;
}

這是不對的。 例如,如果數組為{{-1, -1, -1}, {-1, 1, -1},{-1, -1, -1}} ,則輸出0 0 0 0 ,而正確答案是1 1 1 1 (最好采用中間元素,因為它是唯一肯定的答案)。

這是一個正確的O(n ^ 3)解決方案:讓我們修復上一行。 讓我們創建一個零數組。 現在,我們將迭代從這一行到最后一行的行。 我們將每一行添加到數組中,並為此數組調用一維解決方案。 檢查完所有上面的行后,我們只需要打印最大的答案即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM