dp[i]相当于前i-1家总和
给你一个数组,让你求数组中具有最大和的连续子数组(注意:必须是连续的)
算法思想:i下标对应的最大连续子数组的和就是,i-1下标对应的最大和+i下标的值或者就只是i下标的值,在这里如果dp[i-1]>0,那么dp[i]=dp[i-1]+nums[i],否则dp[i]=nums[i];
先求出各个下标对应的对应的小数组中的最大连续子数组和;
在这些和中,通过比较得出最大的那个值,就是整个数组的最大值。
在进行代码的实现时,可先使用易懂语句实现,再逐步优化:
注意:以下代码中的dp都是一个域值,而不是一个点值,我们需要在域值中找出最大的点值。
int rob(vector<int>& nums)
{
int n = nums.size();
if (n == 0)return 0;
vector<int>dp(n, 0);
dp[0] = nums[0];
for (int i = 1; i < n; i++)
{
if (dp[i - 1] > 0)
{
dp[i] = dp[i - 1] + nums[i];
}
else
{
dp[i] = nums[i];
}
}
return *max_element(dp.begin(), dp.end());//这里相当于一个迭代器,从头到尾遍历一遍,找出最大值
}
//代码优化
int rob(vector<int>& nums)
{
int n = nums.size();
if (n == 0)return 0;
vector<int>dp(n, 0);
dp[0] = nums[0];
int ref = 0;
for (int i = 1; i < n; i++)
{
ref = max(ref, dp[i-1]);
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
}
return ref;
}
//去数组
int rob(vector<int>& nums)
{
int n = nums.size();
if (n == 0)return 0;
int maxsize=0,ref = 0;
for (int i = 0; i < n; i++)
{
ref = max(ref+nums[i], nums[i]);
maxsize = max(ref, maxsize);
}
return maxsize;
}
int main()
{
//vector<int>nums = { -2,5,3,7,-6,8,-9,11,-12 };
vector<int>nums = { -2,1,-3,4,-1,2,1,-5,4 };
cout<<rob(nums)<<endl;
return 0;
}