leetcode最大サブシーケンスと動的プログラミング

その最大戻るを有する(サブアレイが最小要素を含む)NUMSに整数の配列を与えられ、そして連続するサブ配列の最大値を見つけます。

例:

入力:[-2,1、-3,4、-1,2,1、-5,4]、
出力:6
説明:連続サブアレイ[4、-1,2,1]であり、最大値は6でした。

出典:滞在ボタン(LeetCode)
リンク:https://leetcode-cn.com/problems/maximum-subarray

アイデア:私は1得ることができる前に、意思決定は3種類あり、最終的にこれを見つけたので、一般的なダイナミックプログラミングの問題が、初めて初めて、間違った考えのために私はF [i]は、最大数の組み合わせを表し、連続した条件が満たされず、右fとすべきである[I] Iの数の終わりに最大値、および意思決定を示す2つだけです。

不正行為

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(!nums.size())return 0;
        vector<int> f(nums.size());
        //base case 
        f[0]=nums[0];
        //dp
        for(int j=1;j<nums.size();++j){
            f[j]=max(nums[j],max(f[j-1],f[j-1]+nums[j]));
            cout<<f[j]<<endl;
        }
        return f[nums.size()-1];
    }
};

正しいアプローチ

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(!nums.size())return 0;
        //f[i]表示以第i个数结尾的所有连续数组的最大值
        vector<int> f(nums.size());
        //base case 
        f[0]=nums[0];
        //dp
        int ans=f[0];
        for(int i=1;i<nums.size();++i)
            f[i]=max(f[i-1]+nums[i],nums[i]),ans=max(ans,f[i]);
        
        return ans;
    }
};

おすすめ

転載: www.cnblogs.com/clear-love/p/11371370.html