题解 | 最大序列和

最大序列和

https://www.nowcoder.com/practice/df219d60a7af4171a981ef56bd597f7b

//与最长公共子串类似,因为有连续的要求,直接将最大序列和作为中间状态会导致dp[i]和dp[i-1]的关系难以得出,故将中间状态设为包含右边缘的最大序列和,以保证连续的要求并得出dp[i]和dp[i-1]的关系(根据dp[i-1]的正负)
//总结:放苹果,上楼梯等排列组合问题 和 最长公共子序列,最长公共子串,最大序列和等最值问题 可考虑用动态规划解决,相比与直接递归,应记录了中间状态而减低了时间复杂度,是一种空间换时间的策略
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>

using namespace std;

long long s[1000001];//s元素范围-10^9~10^9
long long dp[1000002];//店铺[i]表示 前i个元素 包含右边缘的最大序列和
int main() {
    int n;
    while (scanf("%d", & n) != EOF) {
        for(int i=0;i<n;i++){
            scanf("%lld",&s[i]);
        }

        dp[1] = s[0];//前一个最大序列和只能是第1个元素
        long long curmax = dp[1];
        for (int i = 2; i <= n; i++) {
            if (dp[i - 1] <= 0) {
                dp[i] = s[i - 1];
            } else {
                dp[i] = dp[i - 1] + s[i - 1];
            }
            curmax = max(curmax, dp[i]);
        }
        printf("%lld\n", curmax);
    }
    return 0;
}


动态规划 空间换时间 文章被收录于专栏

动态规划通常用于求解最优解问题, 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题, 然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题, 经分解得到的子问题往往不是互相独立的。

全部评论

相关推荐

09-12 11:55
已编辑
湖南工商大学 Java
那一天的Java_J...:这种一堆问题的,别去
点赞 评论 收藏
分享
09-21 21:14
门头沟学院
否极泰来来来来:和他说:这里不好骂你,我们加个微信聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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