版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
写在前面
- 思路分析
- 求最大连续子序列和,输出最大和以及这个子序列开始值和结束值。
- 如果所有数都小于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个子过程都判断是否能得到符合要求的序列,得到最优解,这是一种动态规划的思想。
- 样例解释