最大子列和問題

2021-10-07 20:04:54 字數 1407 閱讀 4743

例如給定序列-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時,...