使用动态规划解决。
建立dp数组,初始化置零,dp[i]表示从首位到i的当前最大子数组的和。
因为数据范围-10000~10000,所以会有一种情况:前面的数的和加上当前数字,结果反而没有当前数字大,说明前面的数字的和是负数,拖了真正的大数(当前数字)的后腿。这种情况下就要丢掉前面的数,从当前数字算起。
数组从头部遍历到结尾,每次都是最优结果(保证目前的和最大),所以最后才能得到最大子数组的和。
状态转移方程: dp[i] = max(v[i], dp[i-1] + v[i])
结果取dp数组中最大值即为答案。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,ans;
cin>>n;
vector<int> v(n+1),dp(n+1,0);
for(int i=1;i<=n;++i) cin>>v[i];
dp[1]=v[1];
ans=dp[1];
for(int i=2;i<=n;++i){
dp[i]=max(v[i],v[i]+dp[i-1]);
ans=max(ans,dp[i]);
}
cout<<ans;
}

京公网安备 11010502036488号