时间:2016-05-09 19:04:34 星期一
题目编号:[2016-05-09][51nod][1049 最大子段和]
题目大意:
- N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。
分析:
- 动态规划
- dp[i]=max(dp[i−1]+a[i],a[i])
- ans=max(dp[i])
- 全部为负数输出0
遇到的问题:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 1E5 + 10;int a[maxn];ll dp[maxn];int main(){ int n,flg = 1; scanf("%d",&n); for(int i = 0 ; i < n ; ++i){ scanf("%d",&a[i]); if(a[i] >= 0) flg = 0; } if(flg){ printf("0\n");return 0; } memset(dp,0,sizeof(dp)); ll ans = 0; dp[0] = a[0]; for(int i = 1 ; i < n ; ++i){ dp[i] = max((long long)a[i],dp[i - 1] + a[i]); ans = max(dp[i] , ans); } printf("%lld\n",ans); return 0;}