[剑指offer]JT30---连续子数组的最大和(动态规划【全网最详图解】)

题目如下

在这里插入图片描述

动态规划分析

什么是动态规划?
就是最优化理论,我们要得到最优,那么这个答案不仅是当前的最优还取决于前面的状态是不是最优。
如何使用动态规划?
使用动态规划最重要的就是找到状态转移方程
以本题为例
样例的8个数字,我们先用dp数组记录下来
含义就是:包含第i(i最小为0)个数的最大子数组和就是这个数本身

dp[0]dp[1]dp[2]dp[3]dp[4]dp[5]dp[6]dp[7]
1-2310-472-5

最重要的的是找到状态转移方程
其实很好找,就是加上前面的最大子数组和然后和自己比较,如果加上前面的变大了,就更新一下dp数组就可以了。
同学们,我们一起来跑一下这个dp数组吧!
dp[0]=1;
dp[1]=dp[1]+dp[0]>dp[1]?dp[1]+dp[0]:dp[1]=dp[0]+dp[1]=1-2=-1;
dp[2]=dp[2]+dp[1]>dp[2]?dp[2]+dp[1]:dp[2]=dp[2]=3;
下面就不写判断了,直接等于出来了,大家应该看得懂。打字累T.T
dp[3]=3+10=13;
dp[4]=13-4=9;
dp[5]=9+7=16;
dp[6]=16+2=18;
dp[7]=18-5=13;
动态规划之后的dp数组如下:

dp[0]dp[1]dp[2]dp[3]dp[4]dp[5]dp[6]dp[7]
1-13139161813

一目了然,最大和就是里面的最大值了,就是18

是不是突然就觉得动态规划很简单,一下子就懂了讷!

代码如下

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int currCrest=array[0],crest=array[0];
        for(int i=1;i<array.size();i++){
            currCrest=max(currCrest+array[i],array[i]);
            crest=max(currCrest,crest);
        }
        return crest;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值