START:
1 | for (int i = 0; i < 10; i++) |
它在i = 0
j = 0
的时候真的不会执行 j
中的东西啊!
题目
最大子序列。
- 输入:输入第1行给出正整数 K (<= 100000);第2行给出K个整数,其间以空格分隔。
- 输出:
- 最大和小于
0
时,输出0
还有第一个和最后一个元素。 - 其他的输出最大和,最大子序列首尾元素。
- 特别的,如果最大子序列不唯一,输出首位大小最小的。
- 所有数字之间以空格相分开。
- 最大和小于
想法
两种解题思路:
三重循环,
i
j
循环控制首尾元素,k
循环加元素。二重循环,首先算出来前缀和,然后利用
sum[i]-sum[j]
来算出子序列的和。如果,
sum[0]
放的是第 0 个元素的和,sum[4]
放的是第 0 个到第 4 个元素的和。那么,
sum[4] - sum[0]
求出来的即是第 1 个到第 4 个元素的和。
代码
- 三重循环源代码:
1 | /* |
- 二重循环源代码:
1 |
|
思考
这次代码提交了 12 次,对于一些没有考虑到的总结下。
1
2
3
4
5
6
7
8
9
10
11
12···
int maxsum = 0;
int s, e;
···
if (sum > maxsum)
{
maxsum = sum;
s = i;
e = j-1;
}
···
cout << maxsum << " " << v[s] << " " << v[e];在写时报段错误,其原因为:如果给出的序列全为负,则
s
e
无法更新,导致cout
时,使用了未经初始化的内存,所以,应当加入if
判断。如下:1
2
3
4
5
6if (maxsum < 0)
{
maxsum = 0;
s = 0;
e = K - 1;
}
未考虑到
maxsum = 0
的情况:1
2
3
4int maxsum = 0;
···
if (sum > maxsum)
···写时,得到部分正确的结果,应当将
maxsum
的值修改为inf
。在二重循环的时候,搞反
s
e
的值。1
for (int i = 0; i < K; i++)
在二重循环的时候,边界值应当为
i-1
而非i
。1
2
3
4
5
6
7
8
9for (int i = 0; i < 10; i++)
{
cout << i;
for (int j = 0; j < i; j++)
{
cout << " " << j;
}
cout << endl;
}它在
i = 0
j = 0
的时候真的不会执行j
中的东西啊!