最大序列和

最大序列和

http://www.nowcoder.com/questionTerminal/df219d60a7af4171a981ef56bd597f7b

思路

求最大子序列和,我们可以使用动态规划的思路,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;
}
算法题解 文章被收录于专栏

不定期更新一些算法题解,有什么问题可以随时留言~

全部评论

相关推荐

12-24 14:26
东北大学 Java
一只乌鸦:重邮+东北,好经典的学校
最后再改一次简历
点赞 评论 收藏
分享
11-13 20:16
已编辑
厦门理工学院 软件测试
专业嗎喽:硕佬,把学校背景放后面几段,学校背景双非还学院,让人看了就不想往下看。 把实习经历和个人奖项放前面,用数字化简述自己实习的成果和掌握的技能,比如负责项目一次通过率90%,曾4次发现项目潜在问题风险为公司减少损失等等
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务