題目如下:
四種解題思路對應的完整**如下:
//最大子列和求解思路
#include#includeusing namespace std;
int maxsubseqsum1(int nums,int size);
int maxsubseqsum2(int nums,int size);
int maxsubseqsum3(int nums,int size);
int maxsubseqsum4(int nums,int size);
void begin();
int main()
exit(1);
}void begin()
int nums[size];
for(i=0;i>nums[i];
}maxsum = maxsubseqsum1(nums,size);
cout
return sum;
}//基於思路一進行改進,每次右邊界右移乙個單位時,不再重新開始累加求和,直接在之前的基礎上累加,也就是同乙個左邊界i,對於右邊界j右移時,計算一次加法運算即可
//時間複雜度t(n)=o(n^2)
int maxsubseqsum2(int nums,int size) }}
return sum;
}//返回3個整數中的最大的乙個
int getmaxint3(int a,int b,int c)
//遞迴呼叫分治思想的核心**
int dividegovern(int nums,int left,int right)
//先分
center = ( left + right ) / 2;
//遞迴呼叫獲取左邊最大子列和 left.....center
maxleftsum = dividegovern( nums, left, center );
//遞迴呼叫獲取右邊最大子列和 center+1.....right
maxrightsum = dividegovern( nums, center+1, right );
//跨邊界最大子列和
maxleftbordersum = 0;
leftbordersum = 0;
for( i=center; i>=left; i-- ) /* 左邊掃瞄結束 */
maxrightbordersum = 0;
rightbordersum = 0;
for( i=center+1; i<=right; i++ ) /* 右邊掃瞄結束 */
/* 下面返回"治"的結果 */
return getmaxint3( maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum );
}//思路三,分而治之,先分後治,採用遞迴的思想
//時間複雜度為t(n)=o(nlogn)
int maxsubseqsum3(int nums,int size)
//時間複雜度t(n) =o(n)
int maxsubseqsum4(int nums,int size)
if(thissum<0)
}
return sum;
}
最大子列和
int maxsubsequencesum const int a,int n if thissum maxsum 如果新的子列和更大,則更新子列和 maxsum thissum return maxsum 時間複雜度o n3 int maxsubsequencesum const int a,in...
最大子列和
給出乙個長度為 n 的序列 a,選出其中連續且非空的一段使得這段和最大。第一行是乙個整數,表示序列的長度 n。第二行有 n 個整數,第 i個整數表示序列的第 i個數字 a i 輸出一行乙個整數表示答案。輸入7 2 4 3 1 2 4 3 輸出資料範圍 對於 40 的資料,保證 n leq 2 tim...
最大子列和
最大連續子串行和問題 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大連續子串行和即為20。注 為方便起見,如果所有整數均為負數,則最大子串行和為0。解決這樣乙個問題是乙個很有趣的過程,我們可以...