标签:最大 nums int res 连续 数组 dp size
思路一--暴力破解
思路二--动态规划
动态规划五部曲:
第一步:确定dp函数,dp[i]表示以nums[i]结尾的数组最大连续和
第二步:确定递推公式:dp[i]=max(dp[i-1],nums[i]) ,直接判断之前的dp[i-1]是不是大于0也可以.
第三步:确定递推顺序,从前到后 ,dp[i]由dp[i-1]推出,所以是从前到后
第四步:初始化,dp[0]=nums[0], 因为dp数组表示以nums[i]结尾的最大连续和
第五步:手动计算,同时输出日志来记录对照.
#include<vector>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//第一步:dp[j]表示从[0,i]以nums[i]结尾的最大和
//第二步:递推关系,dp[i]=max(dp[i-1]+val[i],nums[i]),记录res
//初始化:dp[0]=val[0]>0?val[0]:0
//第四步:顺序:由前到后
int res = 0;
int size = nums.size();
if (size == 1) return nums[0];
vector<int> dp(size, 0);
dp[0] = nums[0] ;
res = dp[0];
for (int i = 1; i < nums.size(); ++i) {
dp[i] = max(nums[i], dp[i - 1] + nums[i]); //只要前一个是大于0的就可以加上,否则只是表示以当前元素结尾的数组和
res = max(res, dp[i]);
}
return res;
}
};
小结
我们最重要的就是弄清楚dp数组的含义--以nums[i]结尾的最大连续数组和.
递推公式其实也很好想,如果前一个dp[i-1]是正的,那么就能够"带带我",要不然就算了我,我自己来当dp[i].
标签:最大,nums,int,res,连续,数组,dp,size 来源: https://blog.csdn.net/Alanadle/article/details/122364126
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。