C ++アルゴリズム学習(動的計画法アルゴリズム)

1.目標

これは、意思決定プロセスの最適化プロセスを解決するプロセスです。

2.方法

元の問題を解決のためのサブ問題に分解することは、分割統治のアイデアです。

3.プロセス

4つの主要なステップがあります:

  1. サブ問題を分割する:大きな問題を小さな問題に分割する
  2. ステータス:マイナーな問題に対処する方法。
  3. 状態遷移:つまり、親の問題が子の問題をどのように導き出すか。
  4. 境界を決定します:初期状態が何であるかを決定しますか?最小のサブ問題?最終的な状態は何ですか?

4.例

(1)Likou:5。最長の回文部分文字列

class Solution {
    
    
public:
    string longestPalindrome(string s) {
    
    
    int length = s.length();
     vector<vector<bool>> answer(length, vector<bool>(length));
    int Start = 0,End = 0;
    //自己与自己的关系全部设为true,也就是只有一个的情况
    for(int i = 0;i < length;i++){
    
    
        answer[i][i] = true;
    }
    //开始进行遍历,达到条件的就改成true
    for(int j = 1;j < length;j++){
    
    
        for(int i = 0;i < j;i++){
    
    
            if(s.at(i) == s.at(j) &&(i+1 == j || answer[i+1][j-1]))
            {
    
    
               if(j - i >= End - Start){
    
    
                   Start = i;
                   End = j;
               }
               answer[i][j] = true;
            }
        }
    }
    return s.substr(Start,(End - Start + 1));
    }
};

ps:質問のこの部分を書いているときに多くの問題に遭遇しましたが、残念ながらそれを行うのは非常に困難でした。

(1)Likou:1018。5で割り切れる2進接頭辞

たとえば、[0,1,1,1]の場合、最初の数値は0、2番目の数値は01、3番目の数値は011、4番目の数値は0111です。10進数に変換すると、0、1、3、7になります。次に、バイナリルールに従って、データが1ビット左に移動するたびに、データサイズに2が乗算されます。
次に、sum = 0、sum = sum * 2 + numを使用できます。numは[0,1,1,1]の要素であり、sumは変換された10進数です。

class Solution {
    
    
public:
    vector<bool> prefixesDivBy5(vector<int>& A) {
    
    
      vector<bool> a;
    int sum = 0;
    for(auto num : A){
    
    
        sum = sum * 2 +num;
        cout<<sum % 5<<endl;
        if(sum % 5 == 0) a.push_back(1);
        else if(sum % 5 != 0 ) a.push_back(0);
    }
    return a;
    }
};

その後、演算がタイムアウトしたので、変換します。
まず、sum * 2をsum << 1に変換し、直接バイナリ移動位置に変更してから、sumを前のsumの余りと等しくします。 。

class Solution {
    
    
public:
    vector<bool> prefixesDivBy5(vector<int>& A) {
    
    
      vector<bool> a;
    int sum = 0;
    for(auto num : A){
    
    
        sum = (sum << 1) +num;
        a.push_back(sum % 5 == 0);    
    }
    return a;
    }
};

次に、int型データのストレージスペースが十分でないというエラーが報告され、intストレージを小さくする方法を見つけます。

class Solution {
    
    
public:
    vector<bool> prefixesDivBy5(vector<int>& A) {
    
    
      vector<bool> a;
    int sum = 0;
    for(auto num : A){
    
    
        sum = ((sum << 1) +num) %5;
        a.push_back(sum == 0);    
    }
    return a;
    }
};

合計が5で除算されるたびに、合計は余りに等しくなります。余分な数も5の倍数であるため、重要なのは、データの残りの部分をどのように処理できるかを確認することです。

おすすめ

転載: blog.csdn.net/weixin_45743162/article/details/110870972