[英]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.