例如給定序列-2, 11, -4, 13, -5, -2,其連續子列11, -4, 13有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
#include using namespace std;
//方法一:確定子列的開頭和結尾,再遍歷累加,時間複雜度 o(n^3)
int maxsubseqsum1(int n,int a)}}
return maxsum;
}//方法二:確定子列的首部,逐個累加,時間複雜度 o(n^2)
int maxsubseqsum2(int n,int a)}}
return maxsum;
}//方法三:直接累加,如果累加到當前的和為負數,置當前子列和為0,(因為為負不會使後面求最大變得更大)時間複雜度為 o(n)
//該演算法也叫在貪心法或線處理演算法
int maxsubseqsum3(int n,int a)
if(thissum<0)
}return maxsum;
}//演算法4:分而治之
/* 方法四:遞迴分成兩份,分別求每個分割後子列的最大和,時間複雜度為 o(n*logn)*/
/* 返回三者中最大值*/
int max3(int a,int b,int c)
/* 分解成更小規模求解*/
int divideandconquer(int a,int left,int right)
return 0;
}/* 利用遞迴,分別找到最大子列和,分別找到左右最大子列和*/
int center = (left+right)/2;
int maxleftsum = divideandconquer(a,left,center);
int maxrightsum = divideandconquer(a,center+1,right);
/* 再分別找左右跨界最大子列和*/
//從中間邊界往左找
int maxleftbordersum = 0;
int leftbordersum = 0;
for(int i=center;i>=left;i--)
//從中間邊界往右找
int maxrightbordersum = 0;
int rightbordersum = 0;
for(int i=center+1;i<=right;i++)
/*最後返回分解的左邊最大子列和,右邊最大子列和,和跨界最大子列和三者中最大的數*/
return max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}int maxsubseqsum4(int n,int a)
int main()
最大子列和問題
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...
最大子列和問題
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...
最大子列和問題
給出乙個序列,求出最大子列和。演算法一 long maxsum int a,int n return maxsum 這是乙個窮舉的演算法,有三個巢狀的for迴圈,時間複雜度為o n 3 在計算的時候有很多不必要的重複項,例如當i 0,j 3時,和的計算為 a 1 a 2 a 3 當i 0,j 4時,...