诶么、 终于AC了 - -
最长子序列的问题加上了起始点和终止点 (多解的情况下 以第一个为准)
一开始没有考虑到负数的情况 悲剧了 。
看来以后做题得多考虑几组测试数据,考虑全面点。
还有就是int s[100010], r[100010], p[100010];
和
int s[100010];
int r[100010];
int p[100010];
在VC6下不一样呢、
1
#include
<
iostream
>
2
3 using namespace std;
4 int s[ 100010 ], r[ 100010 ], p[ 100010 ];
5
6 int max( int a, int b){
7 return a > b ? a:b;
8 }
9
10 int main(){
11
12 int n;
13 int len;
14 int i,j;
15 int e;
16
17 int mx;
18 cin >> n;
19
20
21 for (j = 0 ;j < n;j ++ ){
22
23
24 cin >> len;
25 for (i = 0 ;i < len;i ++ ){
26 cin >> p[i];
27 }
28
29 int sum = 0 ;
30
31 r[ 0 ] = mx = p[ 0 ];
32 s[ 0 ] = e = 0 ;
33
34 for (i = 1 ;i < len;i ++ )
35 {
36
37 if (p[i] > r[i - 1 ] + p[i]){
38 r[i] = p[i];
39 s[i] = i; // 变成当前数开始
40 }
41 else {
42 r[i] = r[i - 1 ] + p[i];
43 s[i] = s[i - 1 ]; // 加上当前数
44 }
45
46 if (mx < r[i]){
47 mx = r[i];
48 e = i; // 最大
49 }
50 }
51
52
53 cout << " Case " << j + 1 << " : " << endl;
54 cout << mx << " " << s[e] + 1 << " " << e + 1 << endl;
55 if (j != n - 1 )
56 cout << endl;
57
58 }
59
60 return 0 ;
61 }
2
3 using namespace std;
4 int s[ 100010 ], r[ 100010 ], p[ 100010 ];
5
6 int max( int a, int b){
7 return a > b ? a:b;
8 }
9
10 int main(){
11
12 int n;
13 int len;
14 int i,j;
15 int e;
16
17 int mx;
18 cin >> n;
19
20
21 for (j = 0 ;j < n;j ++ ){
22
23
24 cin >> len;
25 for (i = 0 ;i < len;i ++ ){
26 cin >> p[i];
27 }
28
29 int sum = 0 ;
30
31 r[ 0 ] = mx = p[ 0 ];
32 s[ 0 ] = e = 0 ;
33
34 for (i = 1 ;i < len;i ++ )
35 {
36
37 if (p[i] > r[i - 1 ] + p[i]){
38 r[i] = p[i];
39 s[i] = i; // 变成当前数开始
40 }
41 else {
42 r[i] = r[i - 1 ] + p[i];
43 s[i] = s[i - 1 ]; // 加上当前数
44 }
45
46 if (mx < r[i]){
47 mx = r[i];
48 e = i; // 最大
49 }
50 }
51
52
53 cout << " Case " << j + 1 << " : " << endl;
54 cout << mx << " " << s[e] + 1 << " " << e + 1 << endl;
55 if (j != n - 1 )
56 cout << endl;
57
58 }
59
60 return 0 ;
61 }