【動的計画法を学ぶ】スイングシーケンス (27)

目次

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

1. 質問分析

2. アルゴリズム原理

1.ステータス表示

2. 状態遷移方程式

3. 初期化

4. フォームに記入する順序

5. 戻り値

3. コードの書き方

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


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

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

私と一緒に動的計画アルゴリズムの質問を解決し、動的計画を一緒に学びましょう!

1. 質問分析

質問リンク: 376. スイングシーケンス - LeetCode 

この質問は理解しやすいです。数値の差が正の数と負の数の交互であることを見つける必要があります。

実際にはそれほど考える必要はなく、増加、減少、増加、減少、交互という順序で考えることができます。

その場合、探しているのは部分シーケンスであることを忘れないでください。ジャンプして見つけることができます。

2. アルゴリズム原理

1.ステータス表示

dp[i]は、位置iで終わるすべてのサブシーケンスの中で最も長いウォブルシーケンスの長さを表す。

しかし、実際には次の 2 つの状況に分けられます。

f [ i ] は、位置 i で終了し、最後の位置で「上昇」傾向を示す最長のスイング シーケンスの長さを表します。

g[i] は、位置 i で終わる最長のスイング シーケンスの長さを表し、最後の位置は「下降」傾向を示します。

2. 状態遷移方程式

状態遷移方程式は依然として 2 つの主要なカテゴリに分類されます。

f[i] から始めましょう:

f[i] 自体はサブシーケンスとして使用でき、長さは 1

f [ i ] は、その前にある任意の数字と一緒に部分列になることができ、長さは g [ i - 1 ] + 1 です。

ここで注意すべき点は、f[i-1]<f[i]が必要であることです。

次に g[i]:

g[i] 自体はサブシーケンスとして使用でき、長さは 1

g [ i ] は、その前にある任意の数字と一緒に部分列になることができ、長さは f [ i - 1 ] + 1 になります。

ここで注意すべき点は、 g[i-1]>g[i] が必須であることです。

3. 初期化

それらをすべて 1 に設定する限り、最初の状況を考慮する必要はありません。

4. フォームに記入する順序

左から右へ。

5. 戻り値

fテーブルとgテーブルの最大値を返します。

3. コードの書き方

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size(), fmax = 1, gmax = 1;
        vector<int> f(n, 1), g(n, 1);
        for(int i = 1; i < n; i++) {
            for(int j = 0; j < i; j++) {
                if(nums[i] > nums[j]) f[i] = max(f[i], g[j] + 1);
                if(nums[i] < nums[j]) g[i] = max(g[i], f[j] + 1);
            }
            fmax = max(fmax, f[i]);
            gmax = max(gmax, g[i]);
        }
        return max(fmax, gmax);
    }
};

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

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

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

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

おすすめ

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