Likou--53。最大サブシーケンス合計-動的計画法+ローリングアレイ

  1. 最大サブオーダー合計
    整数配列numsが与えられた場合、合計最大の連続サブ配列を見つけ(サブ配列には少なくとも1つの要素が含まれます)、最大の合計を返します。
示例:

输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

詳細な説明については、他のブログを参照しください

コード:

#define Max(a,b) ((a)>(b)?(a):(b))
int maxSubArray(int* nums, int numsSize){
    
    
    if(numsSize==0)
        return 0;
    int dp[numsSize];
    int max = nums[0];
    dp[0]=nums[0];
    for(int i=1;i<numsSize;i++)
    {
    
    
        dp[i]=Max(dp[i-1]+nums[i],nums[i]);
        max=Max(dp[i],max);
    }
    return max;
}

もちろん、別の方法があるかもしれません。つまり、i個の数がある場合の最大のサブシーケンスのサイズとしてdp [i]を設定します。
同様に、次のコードを取得できます。

int max(int a,int b,int c)
{
    
    
    int temp = a>b?a:b;
    return temp>c?temp:c;
}
int maxSubArray(int* nums, int numsSize){
    
    
    if(numsSize==0)
        return 0;
    int dp[numsSize+1];
    dp[1]=nums[0];
    for(int i=2;i<=numsSize;i++)
    {
    
    
        dp[i]=max(dp[i-1]+nums[i-1],nums[i-1],dp[i-1]);//会出现不连续的情况
    }
    return dp[numsSize];
}

しかし、間違った場所が見つかります。つまり、dp [i]はi個の数がある場合にのみ最大のサブシーケンスのサイズを表すため、必ずしもi番目の数が含まれるとは限らないため、dp [i-1] +コード内のnums [i-1]は、現時点では必ずしも連続しているとは限りません。したがって、このように書かないでください。そして、前のものは、添え字iを終わりとして定義したためである可能性があるため、連続している必要があります。

スクロール配列の最適化:

int Max(int x,int y)
{
    
    
    return x>y?x:y;
}
int maxSubArray(int* nums, int numsSize){
    
    
    if(numsSize==0)
    return 0;
    int first,second;
    first=nums[0];
    int max = first;
    for(int i=1;i<numsSize;i++)
    {
    
    
        second=Max(first+nums[i],nums[i]);
        max=Max(second,max);
        first=second;
    }
    return max;
}

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/xiangguang_fight/article/details/112726372