1.窮舉法
演算法思想:算出每個子串行的和,即算出序列中第i個到第j個數的和(j>=i),並進行比較
演算法:
public static int maxsubsum1(int a)
if (sum > maxsum)
}} return maxsum;
}
執行時間為o(n^3)
2.對上述第乙個演算法的改進
演算法思想:第乙個演算法的第三個for迴圈中有大量不必要的重複計算,如:計算i到j的和,然而i到j-1的和在前一次的迴圈中已經計算過,無需重複計算,故該for迴圈可以去掉
演算法:
public static int maxsubsum2(int a)
}} return maxsum;
}
執行時間為o(n^2)
3.分而治之
演算法思想:把問題分成兩個大致相等的子問題,然後遞迴地對它們求解,這是「分」的部分。「治」階段將兩個子問題的解修補到一起並可能再做些少量的附加工作,最後得到整個問題的解。
在該問題中,如果把序列從中間分為兩部分,那麼最大子串行和可能在三處出現,要麼整個出現在輸入資料的左半部,要麼整個出現在右半部,要麼跨越分界線。前兩種情況可以遞迴求解,第三種情況的最大和可以通過求出前半部分(包括前半部分的最後乙個元素)的最大和以及後半部分(包含後半部分的第乙個元素)的最大和而得到,此時將兩個和相加。
演算法:
// 引數:處理陣列,左邊界,右邊界
public static int maxsubsum3(int a, int left, int right) else
} int center = (left + right) / 2;
int maxleftsum = maxsubsum3(a, left, center);
int maxrightsum = maxsubsum3(a, center + 1, right);
int maxleftbordersum = 0, leftbordersum = 0;
for (int i = center; i >= left; i--)
} int maxrightbordersum = 0, rightbordersum = 0;
for (int i = center + 1; i <= right; i++)
} int maxbordersum = maxleftbordersum + maxrightbordersum;
return maxbordersum > maxleftsum ? maxbordersum > maxrightsum ? maxbordersum : maxrightsum
: maxleftsum > maxrightsum ? maxleftsum : maxrightsum;
}
執行時間o(n*logn)
4.最優起點
演算法思想:設a[i]為和最大序列的起點,則如果a[i]是負的,那麼它不可能代表最優序列的起點,因為任何包含a[i]作為起點的子串行都可以通過a[i+1]作起點而得到改進。
類似的,任何負的子串行也不可能是最優子串行的字首。
演算法:public static int maxsubsum4(int a)else if(sum<0)
} return maxsum;
}
最大子串行和的四種演算法
算出每個子串行的和,即算出序列中第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...
最大子串行和的四種求解方法
最大子串行和問題 include includeusing namespace std const int maxn 100 5 分治 int maxz int a,int x,int y 返回陣列左閉右開區間的最大和 v 0 r a m for int i m i y i return max m...
求最大子列和的四種演算法
問題描述 有乙個陣列有正有負,問起最大的連續子列的和是多少。求最大子列和 a1,a2,a3.an 方法1,暴力搜尋 int maxsubseqsum1 int a,int n return max int maxsubseqsum2 int a,int n return max 分治法 int ma...