题解 | 最大序列和
最大序列和
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;
}
动态规划 空间换时间 文章被收录于专栏
动态规划通常用于求解最优解问题, 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题, 然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题, 经分解得到的子问题往往不是互相独立的。
查看30道真题和解析
360集团公司福利 388人发布

