對於乙個連續的陣列a[n],要求連續子陣列,使得該子陣列的和最大。比如陣列,最大子陣列為,和為32。
方法一:窮舉法。即將任取陣列中的兩個元素,算出兩者之間(包括這兩個元素本身)所有元素之和。窮舉所有組合,比較得到最大值。該方法複雜度為n的三次方。
#include #include int sort(int *,int,int);
main()
; printf("%d\n",sort(a,0,15));
}int sort(int *a,int low,int high)
if (sum > max_sum)
max_sum = sum;
} }return max_sum;
}
方法二:遞迴法。以陣列中間元素為分界,將整個陣列分為左邊的陣列和右邊陣列。那麼最大子陣列有三種情況,分別是完全位於左陣列,完全位於右陣列以及橫跨中間元素的陣列。分別對左右陣列進行遞迴,得到最終答案。該方法複雜度為nlgn。
#include #include int find_max_crossing_subarray(int *,int,int,int);//橫跨左右陣列的最大子陣列
int find_maximum_subarray(int *,int,int);//返回最大子陣列的和
main()
; printf("%d\n",find_maximum_subarray(a,0,15));
}int find_max_crossing_subarray(int *a,int low,int mid,int high)
} sum = 0;//處理右陣列
for (i = mid+1;i <= high;i++)
} return left_sum + right_sum;
}int find_maximum_subarray(int *a,int low,int high)
else
}
方法三:
當我們加上乙個正數時,和會增加;當我們加上乙個負數時,和會減少。因此,當和為負數時,應該清零,並重新開始尋找最大子陣列,當陣列元素全為負數時,找到最大元素即可。
#include #include int line_sort(int *,int,int);
main()
; printf("%d\n",line_sort(a,0,15));
}int line_sort(int *a,int low,int high)
if (sum > max_sum)
} if (max_sum == 0)
} }printf("index_start:%d, index_end:%d \n",index_start,index_end);
return max_sum;
}
最大子列和問題(C語言實現)
最大子列和問題 pta 程式設計類實驗輔助教學平台 給定k 個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情...
最大子矩陣 C語言實現
演算法核心 先將二維陣列處理為一維陣列,再對一維陣列進行最大連續子串行求和,這裡最大連續子串行求和採用的是遞推的方法。演算法步驟 1 將原矩陣初始化,並建立乙個臨時二維矩陣,該矩陣的第i行表示的是原矩陣前i行的和 2 採用窮舉的方法,計算二維矩陣所有可能的連續行的列的和,使其壓縮為一維陣列 3 對步...
演算法導論筆記 最大子陣列C語言實現
在分治策略中我們將遞迴的求解乙個問題,在每層遞迴中有如下三個步驟。分解將問題劃分為一些子問題,子問題形式與原問題一樣,只是規模更小。解決遞迴的求解出子問題。如果子問題規模足夠小,則停止遞迴,直接求 解。合併將子問題的解合併為原問題的解。需要遞迴求解時,我們稱之為遞迴情況,當子問題足夠小時,不需要遞迴...