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