思路:
①既然是最大子序列的和,那么不是以m结尾就是以n结尾,前面一个序列(i-1)的和结束后,
以i结尾的 序列和要么带上前面的,要么不带, 这样就能计算出我当前的序列和
但是我也不知道为什么总是case不过(18'')
// PAT A1007最大序列和.cpp : 定义控制台应用程序的入口点。
//
//#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <iostream>
using namespace std;
const int maxn = 10010;
int a[maxn];//存放序列
int dp[maxn];//记录以n为结束位置的最大序列和
int s[maxn];//标记开始位置
int main()
{
int n; scanf("%d",&n);
int count = 0;
for(int i =0;i<n;i++){
scanf("%d",&a[i]);
if(a[i] >0)
count++;
}
if(count == 0){
printf("0 %d %d\n",a[0],a[n-1]);
return 0;
}
dp[0] = a[0]; s[0] = 0;
int max = 0;
for(int i =1;i<n;i++){
int temp = a[i] + dp[i-1];
if(temp > a[i]){
dp[i] = temp;
s[i] = s[i-1];
}else{
dp[i] = a[i];
s[i] = i;
}
if(dp[i] > max) max = dp[i];
}
for(int i =0;i<n;i++){
if(dp[i] == max){
printf("%d %d %d\n",max,a[s[i]],a[i]);
break;
}
}
system("pause");
return 0;
}