hdu 1231 最大连续子序列(最大子段和)

来源:互联网 发布:网络教育不用考试 编辑:程序博客网 时间:2024/06/03 15:34

http://acm.hdu.edu.cn/showproblem.php?pid=1231

求最长子段和并输出子段的端点,设置数组dp[ i ]表示以i结尾的序列的最大和。那么dp[i] = max( dp[i-1] + a[i], a[i] )。

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dp[10010];int main(){int k,a[10010],f;while(~scanf("%d",&k) && k){f = 0;for(int i = 1; i <= k; i++){scanf("%d",&a[i]);if(a[i] >= 0)f = 1;}if(f == 0){printf("0 %d %d\n",a[1],a[k]);continue;}int maxsum,start = 1,end = 1;//初始化memset(dp,0,sizeof(dp));dp[1] = a[1];maxsum = dp[1];for(int i = 2; i <= k; i++){if(dp[i-1] < 0)dp[i] = a[i];else dp[i] = dp[i-1]+a[i];if(maxsum < dp[i]){maxsum = dp[i];end = i;}}int s = 0;for(int i = end; i >= 1; i--)//终点已知,根据最大和倒着找起点{s += a[i];if(s == maxsum)start = i;}printf("%d %d %d\n",maxsum,a[start],a[end]);}return 0;}


0 0
原创粉丝点击