PAT菜鸡笔记1007 Maximum Subsequence Sum
思路:
这题就是找最大子列和和对应位置的元素,这个好像是有标准模板的,我的代码是根据那个思路自己写的,可能比较奇怪。
先取序列第一项作为最大子列和,遍历序列。设当前遍历到第j个元素,则会出现以下几种情况:
- sum<=0且第j个元素>=0,则放弃之前的子列,将左部、sum均归到这个位置,更新max
- sum>0且第j个元素>0,则把当前元素囊括进来,更新max
- 其他情况,统一掠过
最后,判断一下max的值,max<0就输出0,和头尾元素。
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int test[10001];
int main() {
int K,left=0,right=0,Max=-1,sum=0;
int i =0, j = 0;
scanf("%d", &K);
for (int i = 0; i < K; i++)
{
scanf("%d", &test[i]);
}
Max = test[0];
while (j < K)
{
if (sum<=0&&test[j]>=0)
{
i = j;
sum = test[j];
if (Max < sum)
{
left = i;
right = j;
Max = sum;
}
}else
if (sum > 0 && test[j] > 0)
{
sum += test[j];
if (Max < sum)
{
left = i;
right = j;
Max = sum;
}
}else
sum += test[j];
j++;
}
if(Max<0)
{
Max=0;
left=0;
right=K-1;
}
printf("%d %d %d", Max, test[left], test[right]);
return 0;
}