思路
求最大子序列和,我们可以使用动态规划的思路,dp[i] 表示以 nums[i] 结尾的最大和,那么 dp[i] = max(dp[i-1] + nums[i], nums[i]) = dp[i-1] > 0 ? dp[i-1] + nums[i] : nums[i]
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int main(){
int n;
while(cin >> n){
vector<int> dp(n, 0);
int num, ans = INT_MIN;
for(int i = 0; i < n; i ++){
cin >> num;
if(i == 0) dp[i] = num;
else dp[i] = dp[i-1] > 0 ? dp[i-1] + num : num;
ans = max(dp[i], ans);
}
cout << ans << endl;
}
return 0;
} 当然,我们应该尽可能地优化空间复杂度,因为我们每次循环只使用到了 dp[i-1] 来更新 dp[i],我们完全可以使用 O(1) 的空间复杂度。
#include<iostream>
#include<climits>
using namespace std;
int main(){
int n;
while(cin >> n){
int dp = 0;
int num, ans = INT_MIN;
for(int i = 0; i < n; i ++){
cin >> num;
if(i == 0) dp = num;
else dp = dp > 0 ? dp + num : num;
ans = max(dp, ans);
}
cout << ans << endl;
}
return 0;
} 
京公网安备 11010502036488号