【cpp题解】最大子数组和(53)

前言

今天继续来学一学动态规划,一上来就遇到了网红题,据说是以前清北的考研题哈哈哈哈。挺难的,让我做的话,那就是双层循环暴力解,思路很巧妙,学到啦~

我的思路

思路一

设置两层暴力循环就不说了,我最开始想设置一个二维数组,把所有的子数组的和全部存进去,有点暴力,自不必说。

思路二

思路二就很巧妙了,我浅看了一眼以为我懂了,结果写出来的代码还是错的。我还是没有理解动态规划的本质,不知道写了个啥玩意,反正逻辑大大有问题。×

/*if (resArr[i - 1] + Arr[i] > resArr[i - 1]) {
	resArr[i] = resArr[i - 1] + Arr[i];
}
else {
	resArr[i] = resArr[i - 1];
}
if (resArr[i] > res) {
	res = resArr[i];
}*/

我们来说说正确的思路,其实最核心的点在于,我们需要找到 前一个状态和后一个状态之间链接的条件,比如我想找最长的子数组和,那么这个最长的和次长的不仅有**数值上的关系**还有**物理位置上的关系**

我们容易发现次长一定是在最长的前面,因此我们可以得知以i位置结束的子数组一定和i-1位置子数组有关。
即,如果i-1位置的子数组和大于0,那么我们i位置就可以加上i-1位置的和了(对i位置来说,我变大了有好处),如果小于0就我们就放弃这个"小拖油瓶”吧,直接令它为原数组中的值。

觉得简单吗?不,可并不。

我的代码

#include<iostream>
#include<vector>
using namespace std;

class solution {
public:
	int max_subArr_sum(vector<int> Arr) {
		int res= Arr[0];
		vector<int> resArr(Arr.size());
		resArr[0] = res;
		for (int i = 1; i < Arr.size(); i++) {
			/*if (resArr[i - 1] + Arr[i] > resArr[i - 1]) {
				resArr[i] = resArr[i - 1] + Arr[i];
			}
			else {
				resArr[i] = resArr[i - 1];
			}
			if (resArr[i] > res) {
				res = resArr[i];
			}*/
			if (resArr[i - 1] > 0) {
				resArr[i] = resArr[i - 1] + Arr[i];
			}
			else {
				resArr[i] = Arr[i];

			}
			if (resArr[i] > res) {
				res = resArr[i];
			}
		}
		return res;
	}
};

int main() {
	solution s;
	vector<int> Arr = { 1,2,3,-1,2,-1,20,-20,-10 };
	int x=s.max_subArr_sum(Arr);
	cout << x << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值