求最大子串行和學習筆記

2021-08-28 03:24:38 字數 1887 閱讀 8402

題:給定n個整數的序列,求函式f(i

,j)=

ma

xf(i,j)=max\^j a_k\}

f(i,j)

=max

的最大值。

-**實現

主函式

int main(void) ;//隨意設定一組陣列

printf("\n最大子串行之和為:%d", maxsubseqsum1(a,5));

return 0;;

}

方法1

方法_1

方法1​

int maxsubseqsum1(int a,int n)

} }}return maxsum;

}

迴圈次數為t(n

)=o(

n3

)t(n)=o(n^3)

t(n)=o

(n3)方法

2方法_2

方法2​

int maxsubseqsum2(int *a,int n)

} return maxsum;

}

迴圈次數為t(n

)=o(

n2

)t(n)=o(n^2)

t(n)=o

(n2)

當我們看到t(n

)=o(

n2

)t(n)=o(n^2)

t(n)=o

(n2)

應要下意識的想能否將o(n

2)

o(n^2)

o(n2

)轉換為nlogn,由此我們有第三種方法。

方 法3

方法_3

方法3​

int max3( int a, int b, int c )

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 )

迴圈次數為t(n

)=nl

og

nt(n)=nlogn

t(n)=n

logn方法

4方法_4

方法4​

int maxsubseqsum4(int a,int n)

return maxsum;

}

迴圈次數為t(n

)=o(

n)

t(n)=o(n)

t(n)=o

(n)

求最大子串行和

include using namespace std int maxseqsum const int a,int n o n 2 return s2 int maxseqsum2 const int a,int n o n else if s1 0 return s2 int maxseqsum3...

求最大子串行

1.暴力求解,時間複雜度為n 3 int maxsubarray int a int n return maxsum 2.分治法 將陣列從中間分開,那麼最大子陣列要麼完全再左半邊陣列,要麼完全在右半邊陣列,要麼跨立在分界點上。完全在左陣列 右陣列遞迴解決。跨立在分界點上 實際上是左陣列的最大字尾和右...

求最大子串行和演算法

這是個比較經典的c語言演算法問題。記得,在大二參加c語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...