給定k個整數組成的序列,「連續子列」被定義為,其中 1。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:
輸入第1行給出正整數k (≤);第2行給出k個整數,其間以空格分隔。
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
利用分治法。將區間以中間為基準一分為二,將最大子列和問題劃分為左區間、右區間、橫跨左右區間的最大子列和問題。其中左右區間可以通過遞迴完成,中間的最大子列和要另外處理。
最終答案為max(左區間,右區間,橫跨左右區間)的最大子列和。
#include
using namespace std;
int maxsum(int *a, int l, int r);
int main()
cout << maxsum(a, 0, k-1);
return 0;
}int maxsum(int *a, int l, int r)
else
sum = mmax;
for(int j=mid+1; j<=r; j++)
max = mmax > lmax ? mmax : lmax;
max = mmax > rmax ? mmax : rmax;
}return max;
}每次都將區間一分為二遞迴。共logn層。每層要處理橫跨左右區間的最大子段和,o(n),時間複雜度為o(nlogn)
空間複雜度o(n),用於儲存輸入的資料。
學習到了分治的思想,以後遇到新問題會考慮用這種方法。
給定k個整數組成的序列,「連續子列」被定義為,其中 1。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:
輸入第1行給出正整數k (≤);第2行給出k個整數,其間以空格分隔。
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
利用分治法。將區間以中間為基準一分為二,將最大子列和問題劃分為左區間、右區間、橫跨左右區間的最大子列和問題。其中左右區間可以通過遞迴完成,中間的最大子列和要另外處理。
最終答案為max(左區間,右區間,橫跨左右區間)的最大子列和。
#include
using namespace std;
int maxsum(int *a, int l, int r);
int main()
cout << maxsum(a, 0, k-1);
return 0;
}int maxsum(int *a, int l, int r)
else
sum = mmax;
for(int j=mid+1; j<=r; j++)
max = mmax > lmax ? mmax : lmax;
max = mmax > rmax ? mmax : rmax;
}return max;
}每次都將區間一分為二遞迴。共logn層。每層要處理橫跨左右區間的最大子段和,o(n),時間複雜度為o(nlogn)
空間複雜度o(n),用於儲存輸入的資料。
學習到了分治的思想,以後遇到新問題會考慮用這種方法。
演算法第二章上機實踐報告
實踐題目名稱 找第k個小的數 問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。演算法描述 就是先假設a left 為這個分界值x,然後排序。比較x是不是第k個如果是,返回這個值。如果不是比較一下x和a k 的大小,如果xa k 遞迴在x的右邊找 演...
演算法第二章上機實踐報告
7 1 最大子列和問題 20分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...
演算法第二章上機實踐報告
1,實踐題目名稱 最大子列和問題 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試...