[演算法入門經典] 8.1.3 分治法 求最大連續和
阿新 • • 發佈:2018-12-10
int maxsum(int *A,int x,int y) //返回陣列在左比右開區間[x,y)中的最大連續和 { int i, m, v, L, R, max; if(y-x==1) return A[x]; //只有一個元素,直接返回 m=x+(y-x)/2; //分治第一步:劃分成[x,m)和[m,y) max=maxsum(A,x,m)>maxsum(A,m,y)?maxsum(A,x,m):maxsum(A,m,y);//分治第二步:遞迴求解 v=0; L=A[m-1];//分治第三步:合併(1)——從分界點開始往左的最大連續和L for(i=m-1;i>=x;i--) //L>?=v+=A[i]; { v+=A[i]; if(L<v) { L=v; } } v=0;R=A[m]; //分治第三步:合併(2)——從分界點開始往右的最大連續和R for(i=m-1;i<y;i++) //R>?=v+=A[i]; { v+=A[i]; if(R<v) { R=v; } } return max>(L+R)?max:(L+R);//max>?(L+R);//把子問題的解與L和R比較 }