题目如下
动态规划分析
什么是动态规划?
就是最优化理论,我们要得到最优,那么这个答案不仅是当前的最优还取决于前面的状态是不是最优。
如何使用动态规划?
使用动态规划最重要的就是找到状态转移方程
以本题为例
样例的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;
}
};