fork me on github

最大子序列问题(c++实现)

描述:对于给出的K个整数的序列{ N1, N2, ..., NK }.,其连续的子序列定义为 { Ni, Ni+1, ..., Nj },其中1 <= i <= j <= K. 最大子序列是其连续子序列中元素之和最大的子序列。例如:对于 { -2, 11, -4, 13, -5, -2 },  最大子序列为 { 11, -4, 13 },最大和为20。编程找出其最大子序列。

输入:每个输入包含两行,第一行表示序列个数K,第二行为序列的K个元素,各元素间用空格分隔。

输出:最大子序列,如果存在具有相等最大和,则全部输出,每个序列一行。

input:

10

-10 1 2 3 4 -5 -23 3 7 -21

output:

1 2 3 4
3 7
分析:最大的子序列只可能从一个正数开始,我的思路是找出所有可能的子序列存在二维数组(要记录最大值及开始和结束的位置)中。
ps:未考虑存在“0”的情况。其实考虑0只是多出几组本质上一样的子序列。
 1 #include<iostream>
 2 using namespace std;
 3 
 4 //返回该整数列结束的位置(从这个正数到下个负数之前的位置)
 5 int cal(int a[],int n, int i)
 6 {
 7     for (int j = i; j < n; j++)
 8     {
 9         if (a[j + 1] < 0)
10             return j;
11     }
12 }
13 void sort(int a[][3],int n)
14 {
15     for (int i = 0; i < n-1; i++)
16     {
17         int max = 0;
18         for (int j = i; j < n; j++)
19         {
20             if (a[j][0] > a[max][0])
21                 max = j;
22         }
23         int x = a[max][0], y = a[max][1], z = a[max][2];
24         a[max][0] = a[i][0]; a[max][1] = a[i][1]; a[max][2] = a[i][2];
25         a[i][0] = x; a[i][1] = y; a[i][2] = z;
26     }
27 }
28 
29 int main()
30 {
31     static int N[100],n;
32     cin >> n;
33     for (int i = 0; i < n; i++)
34         cin >> N[i];
35     static int count, max[100][3];
36     int a;
37     for (int i = 0; i < n;i++)
38     {
39         if (N[i]>0)//每一个正数段都找出一个可能的最大子序列
40         {
41             max[count][1] = i;
42             int sum = 0;
43             for (int j = i; j < n; j++)
44             {
45                 sum += N[j];
46                 if (sum>max[count][0])
47                 {
48                     max[count][0] = sum;
49                     max[count][2] = j;
50                 }
51             }
52             count++;
53             i += cal(N, n, i);
54         }    
55     }
56     //对可能最子序列按降序排序(由于可能存在多个最大子序列)
57     sort(max, count);
58     //输出最大的子序列
59     for (int i = 0; i < count; i++)
60     {
61         if (max[i][0] == max[0][0])
62         {
63             for (int j = max[i][1]; j < max[i][2]; j++)
64                 cout << N[j] << " ";
65             cout << N[max[i][2]] << endl;
66         }
67     }
68     system("pause");
69     return 0;
70 }

 

posted @ 2015-08-13 22:04  烦嚣的人  阅读(1161)  评论(0编辑  收藏  举报