题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 28539 Accepted Submission(s): 12954
思路:题意很明显,就是求最大字段和。算是比较基础的DP了吧!不明白的话,直接网上搜“最大子段和”就可以了。
附上AC代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 10005; int num[maxn], dp[maxn]; int l[maxn], r[maxn]; int n; int main(){ while (~scanf("%d", &n) && n){ for (int i=0; i<n; ++i) scanf("%d", num+i); dp[0] = num[0]; l[0] = r[0] = 0; for (int i=1; i<n; ++i){ if (dp[i-1] < 0) l[i]=i, dp[i]=num[i]; else l[i]=l[i-1], dp[i]=dp[i-1]+num[i]; r[i] = i; } int maxsum=dp[0], maxl=0, maxr=0; for (int i=1; i<n; ++i) if (dp[i] > maxsum){ maxsum = dp[i]; maxl = l[i]; maxr = r[i]; } if (maxsum < 0) printf("0 %d %d\n", num[0], num[n-1]); else printf("%d %d %d\n", maxsum, num[maxl], num[maxr]); } return 0; }
