题解 | #最大序列和#

最大序列和

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

#include "iostream"
#include "vector"
using namespace std;

// 思路:
// 从最后一个节点出发,不断计算局部最大值并将其保存至dp
// 具体思路:对比自身 & 自身+dp[i+1] 取最大值
// 举例分析:
// 如 1 5 -3 2 4
// dp的初始状态为 0 0 0 0 4 最后一个元素为起始状态
// 开始计算倒数第二个元素 2 的dp值:对比(2,2+dp[i+1])即(2,2+4)最大值为6,dp数组更新为 0 0 0 2 4 maxDp=4
// 倒数第三个 -3 max(-3,-3+6) dp:0 0 3 2 4 maxDp=4
// 倒数第四个 5 max(5,5+3) dp:0 8 3 2 4 maxDp=8
// 最后一个 1 max(1,1+8) dp:9 8 3 2 4 maxDp=9 结果为9
// 实现过程如下
int main() {
	int num;
	while (cin >> num) {
		// define:
		vector<long long int> dp(num);					// 预分配空间
		vector<int> input(num);
		// input:
		for (int i = 0; i < num; i++) cin >> input[i];	// 输入
		// dp:
		dp[num - 1] = input[num - 1];					// 起始状态:最后一个元素的dp一定等于自身
		long long int maxDp = dp[num - 1];				// 记录全局最大值
		for (int i = input.size() - 2; i >= 0; i--) {	// 从倒数第二个开始逆向计算
			long long int temp = input[i] + dp[i + 1];	// 自身+后一个元素的字串最大值(dp)
			dp[i] = temp > input[i] ? temp : input[i];	// 记录dp:对比自身 & 自身+dp[i+1] 取最大值
			maxDp = dp[i] > maxDp ? dp[i] : maxDp;		// 记录全局最大值
		}
		// output:
		cout << maxDp << endl;
	}
	return 0;
}

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务