写在前面
- 思路分析
- 求最大连续子序列和,输出最大和以及这个子序列开始值和结束值。
- 如果所有数都小于0,最⼤和为0,输出首尾元素
- sum最大和, tmp临时最大和, linx和rinx为子序列下标,tinx标记left临时下标
-
tmp = tmp + v[i]
,当tmp比sum大,更新sum值、 linx和rinx的值 - 当tmp < 0,那么后面不管来什么值,都舍弃tmp < 0前面的内容
- 负数对于只可能拉低总和,不可能增加总和
- 舍弃后,令tmp = 0,更新left临时值tinx
- 学习ing
测试用例
input:
10
-10 1 2 3 4 -5 -23 3 7 -21
output:
10 1 4
2 -1 0 应输出 0 0 0
1 0 应输出 0 0 0
2 -1 -2 应输出0 -1 -2
ac代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
vector<int> v(n);
int linx=0, rinx=n-1, sum=-1, tmp=0, tinx=0;
for(int i=0; i<n; i++)
{
scanf("%d", &v[i]);
tmp+=v[i];
if(tmp<0)
{
tmp =0;
tinx = i+1;
}
else if(tmp>sum)
{
sum = tmp;
linx = tinx;
rinx = i;
}
}
if(sum < 0) sum = 0;
printf("%d %d %d",sum, v[linx], v[rinx]);
return 0;
}
知识点小结
- 动态规划(
dynamic programming,DP
)
- 对每个输入元素进行探测,是1个子过程,每1个子过程都判断是否能得到符合要求的序列,得到最优解,这是一种动态规划的思想。
- 样例解释