Aprendizagem de algoritmo C ++ (algoritmo de programação dinâmica)

1. Objetivo

É o processo de resolução do processo de otimização do processo de tomada de decisão.

2. Método

Decompor o problema original em subproblemas para solução é a ideia de dividir para conquistar.

3. Processo

Existem quatro etapas principais:

  1. Divida os subproblemas: divida um grande problema em pequenos problemas
  2. Status: como lidar com questões menores.
  3. Transição de estado: isto é, como o problema dos pais deriva do problema dos filhos.
  4. Determine o limite: determine qual é o estado inicial? O menor subproblema? Qual é o estado final?

4. Exemplos

(1) Likou: 5. A substring de palíndromo mais longa

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: Eu encontrei muitos problemas quando estava escrevendo esta parte das perguntas e foi muito difícil fazer isso, infelizmente.

(1) Likou: 1018. Prefixo binário divisível por 5

Por exemplo, [0,1,1,1], o primeiro número é 0, o segundo número é 01, o terceiro é 011 e o quarto é 0111. Convertido em decimal, eles são 0, 1, 3, 7. Então, de acordo com a regra binária, cada vez que os dados se movem um bit para a esquerda, o tamanho dos dados é multiplicado por 2.
Então, você pode usar soma = 0, soma = soma * 2 + num. num é o elemento em [0,1,1,1] e sum é o decimal convertido.

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;
    }
};

Então a operação expirou, então vou transformá-la.
Primeiro, podemos transformar soma * 2 em soma << 1, alterá-la diretamente para a posição de movimento binária e, em seguida, fazer a soma igual ao resto deixado pela soma anterior .

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;
    }
};

Em seguida, é relatado um erro de que o espaço de armazenamento dos dados do tipo int não é suficiente, então encontre uma maneira de tornar o armazenamento interno menor.

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;
    }
};

Cada vez que soma é dividida por 5 para que a soma seja apenas igual ao resto, porque o número extra também é um múltiplo de cinco, a chave é ver como a parte restante dos dados pode ser processada.

Acho que você gosta

Origin blog.csdn.net/weixin_45743162/article/details/110870972
Recomendado
Clasificación