剑指offer67题-No30.连续子树的最大和

动态规划

方法1,可以通过暴力On^2的方法,循环两次求出每个子数组的和对比。

法2.DP

设dp[i],dp[i]代表以array[i]为结尾的连续子数组最大和。 转移方程为,dp[i] = max(array[i],dp[i-1] + array[i]),理解如下:

  • 因为以第n个数为结尾,所以array[n]是必然被选择的
  • 基于dp[n-1]的值,如果dp[n-1]>0,我们加上这个正数,值必然会增大
  • 如果dp[n-1]<0,那么加上负数,值就会减小,不如不要前面的结果,只要当前这个数,结果反而更优。
#include <vector>
class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int>& array) {
        // write code here
        if(array.size() == 1) return array.front();
        int res = array.front();
        vector<int> dp;
        dp.resize(array.size() + 10, 0);
        
        dp[0] = array.front();

        for(int i = 1; i<array.size(); ++i){
            dp[i] = max(array[i], dp[i-1] + array[i]);
            res = max(dp[i], res);
        }
        
        return res;

    }
};
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇