JZ30連続配列最大和

タイトル 説明
HZ は、専門的な質問を使用して、コンピュータを専門としない人をだますことがあります。今日のテストグループの会議の後、彼は再び話しました: 古代の 1 次元パターン認識では、連続する部分ベクトルの最大和を計算する必要があることがよくあります. ベクトルがすべて正の数である場合、問題は簡単に解決できます.解決。しかし、ベクトルに負の数が含まれている場合、負の数が含まれていて、その隣にある正の数がそれを補うと期待すべきではありませんか? 例: {6,-3,-2,7,-15,1,2,2}、連続するサブベクトルの最大合計は 8 (0 番目から 3 番目まで) です。配列を指定して、その最大の連続部分列の合計を返します。あなたは彼にだまされますか? (サブベクトルの長さは少なくとも 1 です)

解決策: このトピックについて考える最も簡単な方法は, 直接トラバースして最大値を見つけることです. 明らかに, これはこのトピックの本来の意図ではありません. このトピックでは, これは非常に典型的な動的計画問題です: dp[n] は現在の要素をカットオフ ポイントとする連続した部分列< 0, dp[n] は変更されません。現在の数値に負の数値を追加すると確実に小さくなり、最大連続シーケンス値を記録するために max を使用します。

直接トラバース:

class Solution {
    
    
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
    
    
        int len = array.size();
        int sum = 0,max = array[0];
        
        for(int i = 0;i < len;i++)
        {
    
    
            sum = 0;
            for(int j = i;j < len;j++)
            {
    
    
                sum += array[j];
                if(sum > max)
                    max = sum;
            }
        }
        
        return max;
    }
};

動的計画法:

class Solution {
    
    
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
    
    
        int len = array.size();
        int sum = 0,max_val = array[0];
        
        for(int i = 1;i < len;i++)
        {
    
    
            array[i] += array[i - 1] > 0 ? array[i - 1] : 0;
            max_val = max(max_val,array[i]);
        }
        
        return max_val;
    }
};

おすすめ

転載: blog.csdn.net/pikaqiu_n95/article/details/110010650