最大子串行和問題

2021-07-22 08:02:52 字數 1400 閱讀 9092

今天資料結構課講到這個問題的演算法。之前沒有考慮過這個問題,留乙個**備份。

在例子中,最大子串行可能在三個部分出現,整個在資料左部分,或整個在右部分,或跨越輸入資料中部同時佔據兩部分。前兩種情況可以遞迴求解,第三種情況的最大和可以通過求出前半部分最大和(含前半部分最後乙個元素)和後半部分最大和(含後半部分第乙個元素)加和得到。

eg:

4 -3 5 -2 | -1 2 6 -2

前半部分 | 後半部分

前半部分最大子串行之和為6,a1-a3。後半部分最大為8,a6-a7。

前半部分包括最後乙個元素的前提下,最大和為4,a1-a4。後半部分包括第乙個元素的情況下最大和為7,a5-a7,二者相加即中間最大項11。

比較前部分最大和,後部分最大和,中間最大和。得到最大子串行項。

遞迴過程呼叫的一般形式是傳遞輸入的陣列以及左右邊界,界定了陣列要被處理的部分,單行驅動程式通過傳遞陣列以及邊界0和n-1而啟動該過程。

1-4行處理基準情況,如果left == right,那麼只有乙個元素,並且當該元素為非負時他就是最大和子串行。left > right 的情況不會發生(除非n為負數)。6.7行兩次遞迴呼叫。8-12和13-17行計算達到中間分界處的兩個最大和的和數。這兩個最大和的和為擴充套件到左右兩邊的最大和。

**:

static

int maxsubsum( const

int a, int left, int right)

}// 包含右側最後乙個元素的序列和,從其中找最大的。

maxrightbordersum = 0;

rightbordersum = 0;

for (i=center+1; i<=right; i++)

}return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);

}int maxsubsequencesum(const

int a, int n)

int max3(int a, int b, int c)

if (a > c)

return a;

else

return c;

}

從別的地方看了一下解釋。本來還懵逼著。不過大概意思好像是推進。

如果數小於0,就可以直接清零重置。同時把最大值儲存下來。不太明白要怎麼解釋比較好,但這種掃瞄一次的結果的演算法簡直666。書上寫僅需要常量空間並以線性時間執行的聯機演算法幾乎是完美的演算法。

int maxsubsequencesum(const

int a, int n)

else

if (thissum < 0)

return maxsum;

}}

最大子串行和問題

問題 給定一整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大 例如 整數序列 2,11,4,13,5,2,5,3,12,9的最大子串行的和為21。對於這個問題,最簡單也是最容易想到的那就是窮舉所有子串行的方法。利用三重迴圈,依次求出所有子串行的和然後取...

最大子串行和問題

問題描述 給定乙個整數序列 可能有負數 求一子串行 記為l 使得該子串行所有元素之和最大。例 給定序列 2,11,4,13,5,2,則最大子串行和為20 11,4,13 方法一 遍歷窮舉 o n 2 略方法二 分治遞迴 o n logn 思路 將輸入序列l分為左右兩個子串行l1和l2,則l 只可能以...

最大子串行和問題

問題描述 求 2,11,4,13,5,2 的最大子串行和。方法一 使用3層for迴圈巢狀,窮舉式的嘗試所有的可能,如下 public class demo1 return maxsum public static void main string args system.out.println 最大...