最大连续子序列和2(浙大2005研究生复试上机考试题)
【问题描述】
给定一个数字序列 A₁, A₂, ..., Aₙ,求 i, j (1 ≤ i ≤ j ≤ n),使得 Aᵢ + ... + Aⱼ 最大,输出这个最大和。
【样例】
输入:6 -2 11 -4 13 -5 -2
输出:20 11 13
【新增要求】
现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。
【样例输入与输出】
-
输入:5
-3 9 -2 5 -4输出:12
9 5 -
输入:3
-2 -3 -1输出:-1
-1 -1
#include <iostream>
using namespace std;int main(){int a[1001];int dp[1001];int sp,fp;//记录子序列第一个元素的位置和子序列最后一个元素的位置int n;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];dp[1]=a[1];sp=1;fp=1;int csp=1;//临时存储起点int ma=a[1];for(int i=2;i<=n;i++){if(dp[i-1]>0)dp[i]=dp[i-1]+a[i];else {//当dp【i-1】<=0时,代表从当前点重新开始计算一个新的子序列,记录临时起点 或者当dp[i]等于a[i]时候,说明也开始了一个新的子序列dp[i]=a[i];csp=i;}if(dp[i]>ma){//只有当新的子序列的值大于之前最大子序列的值的时候,才会把临时起点赋值给到起点,同时记录终点sp=csp;fp=i;}ma=max(ma,dp[i]);}cout<<ma<<" "<<a[sp]<<" "<<a[fp];return 0;
}
