1. 程式人生 > >(4)C語言——求最大連續子序列和

(4)C語言——求最大連續子序列和

log spa clas 最大連續子序列和 alloc 最大 code max 連續

題目:

輸入一組整數,求出這組數字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那個序列。例如:

序列:-2 11 -4 13 -5 -2,則最大子序列和為20。

序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,則最大子序列和為16。

1.

 1 /*
 2     算法一:窮舉法(3個for)
 3             時間復雜度:O(n^3)
 4 
 5 */
 6 #include <stdio.h>
 7 #include <malloc.h>
 8 
 9 int Max = 0;
10 int find_max(int len, int
arr[]){ 11 int i, j, k, sum; 12 for(i=0; i<len; i++){ 13 for(j=i; j<len; j++){ 14 sum = 0; 15 for(k=i; k<=j; k++){ 16 sum += arr[k]; 17 } 18 if(sum > Max){ 19 Max = sum; 20 } 21 }
22 } 23 return Max; 24 25 } 26 27 int main(){ 28 int i, len, *arr; 29 printf("請輸入數組的長度: "); 30 scanf("%d",&len); 31 arr = (int *)malloc(sizeof(int)*len); 32 printf("請輸入數組的值:"); 33 for(i=0; i<len; i++){ 34 scanf("%d",&arr[i]); 35 } 36 find_max(len,arr);
37 printf("最大連續子序列和 :%d\n", Max ); 38 39 return 0; 40 }

2.

 1 /*
 2     算法二:算法一的優化 (2個for)
 3             時間復雜度:O(n^2)
 4 */
 5 #include <stdio.h>
 6 #include <malloc.h>
 7 
 8 int Max = 0;
 9 int find_max(int arr[],int n, int len){
10       int i, sum = 0;
11     for(i=n; i<len; i++){
12         sum += arr[i];
13         if(sum > Max){
14             Max = sum ;    
15         }
16     }
17     return Max;
18 } 
19 
20 int main(){
21     int i, len,  *arr;
22     printf("請輸入數組的長度:");
23     scanf("%d",&len);
24     arr = (int *)malloc(sizeof(int)*len);
25     printf("請輸入數組的值:");
26     for (i=0; i<len; i++)
27     {
28         scanf("%d", &arr[i]);
29     }
30 
31     
32     for(i=0; i<10; i++){
33        find_max(arr,i, len);
34     }
35         
36     printf("最大連續子序列和:%d \n",Max);
37 
38     return 0;
39 }

3.

 1 /*
 2     算法三:聯機算法
 3     時間復雜度:O(n)
 4 */
 5 #include <stdio.h>
 6 #include <malloc.h>
 7 
 8 int Max = 0;
 9 int find_max(int len, int arr[])
10 {
11     int i, sum = 0;
12     for(i=0; i<len; i++)
13     {
14         sum += arr[i];
15         if(sum  > Max)
16         {
17             Max = sum;
18         }else if(sum < 0){
19             sum = 0;
20         }    
21     }
22 
23     return Max;
24 }
25 
26 int main(){
27     int i, len, *arr;
28     printf("請輸入數組的長度:");
29     scanf("%d",&len);
30     arr = (int *)malloc(sizeof(int)*len);
31     printf("請輸入數組的值:");
32     for (i=0; i<len; i++)
33     {
34         scanf("%d", &arr[i]);
35     }
36     find_max(len, arr);
37     printf("最大連續子序列和:%d \n",Max);
38     return 0;
39 }

參考:http://blog.163.com/kevinlee_2010/blog/static/169820820201010495438247/

(4)C語言——求最大連續子序列和