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

剑指offer第三十题

题目如下

在这里插入图片描述

动态规划分析

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

dp[0] dp[1] dp[2] dp[3] dp[4] dp[5] dp[6] dp[7]
1 -2 3 10 -4 7 2 -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 -1 3 13 9 16 18 13

一目了然,最大和就是里面的最大值了,就是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;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42136832/article/details/114867405