最大子段和問題

2021-06-21 06:22:39 字數 1286 閱讀 7840

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整均為負數時定義子段和為0

分治法:

分析:首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大子段和,右邊最大子段和以及橫跨分割點這種情況的最大子段和進行比較返回大的那個即可。

//最大子段和

//如果將序列a[1:n]分為長度相等的兩段a[1:n/2]和a[n/2+1:n],分別求出

//這兩段的最大子段和,則a[1:n]的最大子段和有三種情況

//a[1:n]的最大子段和在左邊

//a[1:n]的最大子段和在右邊

//a[1:n]最大子段和橫跨交界處

#include int maxsubsum(int *a, int left, int right)

else

}//從中間向右邊求出最大子段和

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

}sum = s1 + s2;//最大子段和在交界處

//三種情況進行比較 在sum leftsum rightsum中挑出最大的

if (sum < leftsum)

if (sum < rightsum)

}return sum;

}int main(void)

sum = maxsubsum(a, 0, 9);

printf("%d\n", sum);

return 0;

}

動態規劃法:

//動態規劃法

//b[j]=max,1<=i<=j,且1<=j<=n,則所求的最大子段和為max b[j],1<=j<=n。

//由b[j]的定義可易知,當b[j-1]>0時b[j]=b[j-1]+a[j],否則b[j]=a[j]。故b[j]的動態規劃遞迴式為:

//b[j]=max(b[j-1]+a[j],a[j]),1<=j<=n。

//t(n)=o(n)

#include int maxsum(int n, int *a)

}return sum;

}int main(void)

;

printf("最大子段和:\n");

printf("maxsum = %d\n", maxsum(5, a));

return 0;

}

最大子段和問題

給定n 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...

最大子段和問題

問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如 a i a i 1 a j 當所給的整數均為負數時定義子段和為0.如果序列中全部是負數則 最大子段和為0,依次所定義 所求的最優值max,1 i問題解析 動態規劃演算法 dp i 包含元素i的子段和 dp 0 ...

最大子段和問題

給定n個整數 可能為負整數 a1,a2,a3 an.求形如 ai,a i 1 aj i,j 1,n,i j 的子段和的最大值。當所有的整數均為負整數的時候定義其最大子段和為0,例如 當 a1,a2,a3,a4,a5,a6 2,11,4,13,5,2 時,最大子段和為 i 2,j 4 下標從1開始 列...