hdu1003 Max Sum【最大子段和】
题目链接:https://vjudge.net/problem/HDU-1003
题目大意:
给出一段序列,求出最大连续子段之和,以及给出这段子段的起点和终点。
解题思路:
最长连续子序列之和问题其实有很多种求解方式,这里是用时间复杂度为O(n)的动态规划来求解。
思路很清晰,用dp数组来表示前i项的最大连续子序列之和,如果dp[i-1]>=0的话,则dp[i]加上dp[i-1]能够使dp[i]增大;若dp[i-1]<0的话,则重新以dp[i]为起点,起点更新。
#include <bits/stdc++.h> using namespace std; #define RP(i,s,t) for(int i=s;i<=t;i++) const int N = 1e5+5; int dp[N]; int main(){ int ncase=0; int n,T;cin>>T; while(T--){ scanf("%d",&n); RP(i,1,n) scanf("%d",&dp[i]); dp[0]=-1; int mx=-2e9; int s,e,nows; s=e=nows=1; RP(i,1,n) { if(dp[i-1]>=0) dp[i]+=dp[i-1]; else nows=i; if(mx<dp[i]){ mx=dp[i]; e=i; s=nows; } } printf("Case %d:\n",++ncase); printf("%d %d %d\n",mx,s,e); if(T) puts(""); } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。