找出连续子序列和最大的动态规划

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

示例:3,-4,2,-1,2,6,-5,4
输出:9(2-1+2+6=9)


提示:以下是本篇文章正文内容,下面案例可供参考

一、思路

设置dp[i]进行迭代。代表从数组的某位一直加到i位时的最大值。
设置max选出从开始循环的最大值。

dp[i]=std::max(num[i],dp[i-1]+num[i]);
max=std::max(dp[i],max);

直观来说:3,-4,2,-1,2,6,-5,4
dp[0]=3
dp[1]=-1 (3-4)
dp[2]=2 (2)
dp[3]=1 (2-1)
dp[4]=3 (2+2-1)
dp[5]=9 (6+2+2-1)
……
max就是显示第i位时最大的和

二、完整代码

  1 #include "myinclude.h"
  2 int get_max(const std::vector<int>& num);
  3 int main(void)
  4 {
  5         std::vector<int> num={3,-4,2,-1,2,6,-5,4};
  6         int result=get_max(num);
  7         std::cout<<result<<std::endl;
  8 }
  9 int get_max(const std::vector<int>& num)
 10 {
 11         std::vector<int> dp(num.size(),0);
 12         dp[0]=num[0];
 13         int max=dp[0];
 14         for(int i=1;i<num.size();i++)
 15         {       
 16                 dp[i]=std::max(num[i],dp[i-1]+num[i]);
 17                 max=std::max(dp[i],max);
 18         }       
 19         return max;
 20 }

建议大家手写一遍
在这里插入图片描述
完结撒花!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值