演算法部分
#include #include using namespace std;
////
////
//s(tart)表示最大子串行的開始位置,e(nd)表示結束位置
//這裡如果有多於乙個的最大子串行的時候,只記錄開始位置最低的那個
int s=0;
int e=0;
//窮舉法,複雜度o(n^3)
long maxsubsum1(const vector&a)
} }return maxsum;
}//也是窮舉法,不過減去了上面的一些不必要操作o(n^2)
long maxsubsum2(const vector&a)
} }return maxsum;
}long max3(long a, long b, long c)
long maxsumrec(const vectora, int left, int right)
int center=(left+right)/2;
long maxleftsum=maxsumrec(a,left,center);
long maxrightsum=maxsumrec(a,center+1,right);
//某段序列中,求含最右側元素序列和的最大值
long maxleftbordersum=0,leftbordersum=0;
for (int i=center; i>=left; i--) }
//某段序列中,求含最左側元素序列和的最大值
long maxrightbordersum=0,rightbordersum=0;
for (int j=center+1; j<=right; j++) }
return max3(maxleftsum,maxrightsum,
maxleftbordersum+maxrightbordersum);
}//該方法我們採用「分治策略」(divide-and-conquer),相對複雜的o(nlogn)的解法
//最大子串行可能在三個地方出現,或者在左半部,或者在右半部,
//或者跨越輸入資料的中部而佔據左右兩部分。前兩種情況遞迴求解,
//第三種情況的最大和可以通過求出前半部分最大和(包含前半部分最後乙個元素)
//以及後半部分最大和(包含後半部分的第乙個元素)相加而得到。
long maxsubsum3(const vector&a)
//如果a[i]是負數那麼它不可能代表最有序列的起點,因為任何包含a[i]的作為起點的子
//序列都可以通過用a[i+1]作為起點來改進。類似的有,任何的負的子串行不可能是最優
//子串行的字首。例如說,迴圈中我們檢測到從a[i]到a[j]的子串行是負數,那麼我們就可以推進i。
//關鍵的結論是我們不僅可以把i推進到i+1,而且我們實際可以把它一直推進到j+1。
long maxsubsum4(const vector&a)
else if(thissum<0)
} return maxsum;
}
測試程式
int main()
四種求最大子串行和問題的解
include includeusing namespace std int maxsubsum1 const vector a return maxsum int main size t size sizeof a sizeof int vectorvec a,a size cout includ...
最大子串行和的四種演算法
1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...
最大子串行和的四種演算法
算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較。執行時間為o n 3 maxsum 0 nums d n int input 輸入陣列長度 for i in range 0 n k int input 輸入資料 for i in range 0 len nums for j...