问题如下:给定一个数字序列A1,A2……An,求i,j(1<=i<=j<=n),使得A1+……+Ai最大,输出这个最大和
方法如下:
步骤1:令状态dp[i]表示以A[i]作为末尾的连续序列的最大和
步骤2:因为dp[i]要求必须以A[i]作为末尾元素,那么只有两种情况
(1)这个最大和的连续序列中只有一个元素,即以A[i]开始,以A[i]结尾
(2)这个最大和的连续序列中有多个元素,即从前面某处A[p]开始(p<i),一直到A[i]结束
于是可以得到状态转移方程如下:
dp[i]=max(A[i],dp[i-1]+A[i]);
可以很容易的写出代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
int A[maxn],dp[maxn],n;
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>A[i];
}
dp[0]=A[0];//边界条件
for(int i=1;i<n;i++){
dp[i]=max(dp[i-1]+A[i],A[i]);
}
int ans=-1;
for(int i=0;i<n;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}