最大子串行求和問題

2022-09-12 17:42:23 字數 3009 閱讀 7783

給定整數a1

' role="presentation">a1a

1,a2

' role="presentation">a2a

2,…, an

' role="presentation">ana

n(可能有負數),求∑k

=ija

k' role="presentation">∑jk

=iak

∑k=i

jak的最大值(為方便起見,如果所有整數均為負數,則最大子串行和為0)。

演算法1:

int max_sub_sum(const int a, int n)

if(sum > maxsum)

maxsum = sum;}}

return maxsum;

}

演算法1的時間複雜度為o(

n3)' role="presentation">o(n

3)o(

n3)演算法2:

int max_sub_sum2(const int a, int n)}}

return maxsum;

}

演算法2的複雜度為o(

n3)' role="presentation">o(n

3)o(

n3),與演算法1相比,演算法2減少了乙個內層迴圈

演算法3

int maxsubsum(const

int a, int left, int right)

else

if(left == right) else

} else

}tmpsum = maxrightborder = 0;

for(i = center+1; i<=right; i++)

}maxcrosssum = maxleftborder+maxrightborder;

if(maxcrosssum >= maxleftsum && maxcrosssum >= maxrightsum)

return maxcrosssum;

if(maxleftsum >= maxcrosssum && maxleftsum >= maxrightsum)

return maxleftsum;

if(maxrightsum >= maxcrosssum && maxrightsum >= maxleftsum)

return maxrightsum;

}}int max_sub_sum3(const

int a, int n)

演算法3用了分治法來求解,以序列的中間為分界線,最大子串行要麼再左邊一半,要麼再右邊一半,要麼穿過中間,只要分別求左邊一半最大子串行、右邊一半最大子串行和穿過中間愛的最大子串行,最後從它們之間選出最大的即是整個序列的最大子串行,該分治演算法的時間複雜度為o(

nlog⁡n

)' role="presentation">o(n

logn)o

(nlog⁡n)

演算法4

int max_sub_sum4(const int a, int n)

else

if (sum

< 0)

}return maxsum;

}

演算法4的時間複雜度為o(

n)' role="presentation">o(n

)o(n

),該演算法只要讀一遍輸入序列就可以算出最大子串行和

#include 

#include

int max_sub_sum(const

int a, int n)

}return maxsum;

}int max_sub_sum2(const

int a, int n)}}

return maxsum;

}int maxsubsum(const

int a, int left, int right)

else

if(left == right) else

} else

}tmpsum = maxrightborder = 0;

for(i = center+1; i<=right; i++)

}maxcrosssum = maxleftborder+maxrightborder;

if(maxcrosssum >= maxleftsum && maxcrosssum >= maxrightsum)

return maxcrosssum;

if(maxleftsum >= maxcrosssum && maxleftsum >= maxrightsum)

return maxleftsum;

if(maxrightsum >= maxcrosssum && maxrightsum >= maxleftsum)

return maxrightsum;

}}int max_sub_sum3(const

int a, int n)

int max_sub_sum4(const

int a, int n)

else

if (sum < 0)

}return maxsum;

}int main()

; printf("max_sub_sum = %d\n", max_sub_sum(a, sizeof(a)/sizeof(int)));

printf("max_sub_sum = %d\n", max_sub_sum2(a, sizeof(a)/sizeof(int)));

printf("max_sub_sum = %d\n", max_sub_sum3(a, sizeof(a)/sizeof(int)));

printf("max_sub_sum = %d\n", max_sub_sum4(a, sizeof(a)/sizeof(int)));

return

0;}

最大子串行求和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。輸入第1行給出正整數k 第2行給出k個整數,其間以空格分隔。在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。6 2 11 4 1...

最大子串行求和 絕妙的演算法 最大子串行和問題

問題的引入 給定 可能有負數 整數序列a1,a2,a3.an,求這個序列中子序列和的最大值。為方便起見,如果所有整數均為負數,則最大子串行和為0 例如 輸入整數序列 2,11,8,4,1,16,5,0,則輸出答案為35,即從a2 a6。這個問題之所以有吸引力,主要是因為存在求解它的很多演算法,而這些...

最大子串行求和整理筆記

在最大子串行的問題中,這裡有四種解法,時間複雜度由高到低,可以直觀的感受到解決問題的演算法技巧。c語言 如下 include define maxn 100 int a maxn 輸入 void input int a,int n 輸出 void output int a,int n o n n n...