//确定dp数组(dp table)以及下标的含义
//dp[i]:包括下标i之前的最大连续子序列和为dp[i]。
//
//确定递推公式
//dp[i]只有两个方向可以推出来:
//
//dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
//nums[i],即:从头开始计算当前连续子序列和
#include<bits/stdc++.h>
using namespace std;
int maxSubArray(vector<int>& nums)
{
if (nums.size() == 0) return 0;
vector<int> dp(nums.size());
dp[0] = nums[0];
int result = dp[0];
for (int i = 1; i < nums.size(); i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]); // 状态转移公式
if (dp[i] > result) result = dp[i]; // result 保存dp[i]的最大值
}
return result;
}
int main()
{
vector<int> nums{-2,1,-3,4,-1,2,1,-5,4};
int ans = maxSubArray(nums);
cout<<ans;
return 0;
}
求连续子数组的最大和问题(c++)
最新推荐文章于 2024-04-23 04:33:05 发布