Problem Description
给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为:
Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
注意:本题目要求用动态规划法求解,只需要输出最大子段和的值。
Input
第一行输入整数n(1<=n<=100000),表示整数序列中的数据元素个数;
第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。
Output
输出所求的最大子段和
Example Input
6 -2 11 -4 13 -5 -2
Example Output
20
Hint
Author
ps:
动态规划掌握的很差劲,还要继续加油啊!
#include <stdio.h> #include <stdlib.h> #include <string.h>
#include<bits/stdc++.h> #include <iostream> #include <algorithm> #define maxn
10100 using namespace std; int max1=0; typedef struct list { int *data; int
last; }seq;void head(int n, seq &seeq) { seeq.data=(int *)malloc(sizeof(int)*n);
int i=0; while(n--) { scanf("%d", &seeq.data[i++]); } seeq.last=i; } void
tlcs(seq &seeq) {for(int a=1; a<seeq.last; a++) { if(seeq.data[a]<seeq.data[a-1
]+seeq.data[a]) seeq.data[a]=seeq.data[a-1]+seeq.data[a]; if
(seeq.data[a]>max1)max1=seeq.data[a]; } }int main() { int n; seq seeq; scanf(
"%d", &n); head(n, seeq); max1=seeq.data[0]; tlcs(seeq); if(max1<0)max1=0;
printf("%d\n",max1); return 0; }