【動的計画法を学ぶ】部分配列の最大和(19)

目次

動的プログラミングを学ぶにはどうすればよいですか?

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

最後に次のように書きます。


動的プログラミングを学ぶにはどうすればよいですか?

動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。

動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!

1. トピック分析

トピックリンク: 53. サブ配列の最大合計 - LeetCode

内容は分かりやすく、名前の通り部分配列の合計の最大値を求めるというものです。

2. アルゴリズム原理

1. ステータス表現

位置 dp[ i ] は、位置 i の要素で終わるすべての部分配列の最大合計を表します。

2. 状態遷移方程式

状態遷移方程式には 2 つのケースがあります。

1. 部分配列の長さが 1 の場合、合計の最大値は位置 i の値になります。

2. サブ配列の長さが 1 より大きい場合、最大合計は、前の位置 + 現在の位置の値の最大合計になります。

これで状態遷移方程式が得られます

dp [ i ] = max( nums[ i ],dp[ i ] + nums[ i ] )

3. 初期化

初期化は範囲外を防ぐためのものであり、後続の値には影響しません。

0に初期化するだけです。

4.注文の実行

左から右に進むだけです。

5. 戻り値

dp テーブル全体の最大値を返します。

3. コードの書き方

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n = nums.size();
        vector<int> dp(n + 1);
        int ans = INT_MIN;
        for(int i = 1; i <= n ; i++) {
            dp[i] = max(nums[i - 1], dp[i - 1] + nums[i - 1]);
            ans = max(ans, dp[i]);
        }
        return ans;
    }
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131821926