求解最大欄位和

2021-10-08 11:42:38 字數 1425 閱讀 8972

演算法1:窮舉法,對所有的(i,j)對,順序求和a[i]+…a[j]並比較出較大的和

演算法2:分治法,將陣列分成左右兩半,分別計算左邊的最大和、右邊的最大和、跨邊界的最大和,然後比較其中的最大者。

演算法3:動態規劃法

#include

#include

//窮舉法求出所有子段和的情況,比較得到較大值 o(n^3)

void

sum(

int*arr,

int len)

if(sumnum>maxnum)}}

printf

("%d\n"

,maxnum);}

//對窮舉法進行的改進 o(n^2)

void

sum1

(int

*arr,

int len)}}

printf

("%d\n"

,maxnum);}

intmain()

;for

(int i=

0;i)int len=

sizeof

(arr)

/sizeof

(arr[0]

);sum(arr,len)

;}

#include

#include

#include

#include

using namespace std;

//使用動態規劃求解最大子段和 o(n)

//dp[i]表示以arr[i]結尾的最大子段和,dp[i]=max(dp[i-1]+arr[i],arr[i])

void

maxsum

(int

*arr,

int len)

; dp[0]

=arr[0]

;for

(int i=

1;i)else

if(max<=dp[i])}

printf

("%d\n"

,max);}

//對動態規劃做出的改進,省略了dp陣列,只需要兩個臨時變數

// void maxsum(int *arr,int len)

// // else

//

// if(max<=temp)

//

// }

// printf("%d\n",max);

// }

intmain()

;for

(int i=

0;i)int size=

sizeof

(arr)

/sizeof

(arr[0]

);maxsum

(arr,size)

;}

最大欄位和求解方法

問題描述 給定n個整數 可能有負數 組成的序列a1,a2,an,求該序列的最大子段和。如果所有整數都是負數,那麼定義其最大子段和為0。方法一 暴力雙重迴圈破解法 方法二 遞迴分治 在陣列的 center right left 2 left 位置處分開。形成兩個子陣列。那麼,最大子段和 可能出現在三個...

最大欄位和

include include include include include using namespace std 最大欄位和問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,...

最大欄位和

1049 最大子段和 難度 基礎題 n個整數組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。input 第1行 整數序列的長度n 2 n 5...