演算法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...