#include <iostream> #include <string.h> #include <stdio.h> using namespace std; int main() { int n; int a[105]; int dp[105]; while(cin >> n) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { cin >> a[i]; } for(int i=1;i<=n;i++) { if(dp[i-1]>0) { dp[i]=dp[i-1]+a[i]; } else { dp[i]=a[i]; } } int max=-1000; for(int i=1;i<=n;i++) { if(dp[i]>max) { max=dp[i]; } } cout << max << endl; } return 0; }
已知有一个序列{Ai},其中都是整数,但不一定为正数,请求出其中连续的一段子串,使得这个子串的所有值相加的和最大,子串不允许为空。(最大子段和)
状态:dp[i]代表包含i点,且不包含i+1及之后的点,的子串中的最大和。
状态转移方程:dp[i-1]>0?dp[i]=dp[i-1]+a[i]:dp[i]=a[i];