給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列(不允許空序列),使它們的和盡可能大。
/*演算法一*/
int maxsubseqsum1(int a, int n)
if(thissum > maxsum)
} //j迴圈結束
} //i迴圈結束
return maxsum;
}
/*演算法二*/
int maxsubseqsum2(int a, int n)
} //j迴圈結束
} //i迴圈結束
return maxsum;
}
/*演算法三:分治法*/
/*返回三個整數的最大值*/
int max3(int a, int b, int c)
/*分治法求list[left]到list[right]的最大子列和*/
int divideandconquer(int list, int left, int right)
/*「分」的過程 */
center = (left + right) / 2; //找到中分點
maxleftsum = divideandconquer(list, left, center); //遞迴求左子列和
maxrightsum = divideandconquer(list, 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 max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
}/*此函式用於保持介面相同*/
int maxsubseqsum3(int list, int n)
int maxsubseqsum4(int a, int n)
return maxsum;}
最後,寫乙個主函式進行測試,第1行輸入正整數n;第2行給出n個整數,其間以空格分隔。
#include #define max 100000
int main() ;
scanf("%d", &n);
for ( i = 0; i < n; i++ )
scanf("%d", &a[i]);
printf("%d", maxsubseqsum1( a, n ));
return 0;
}
最大子列和問題
給定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時,...