Aprendizaje de algoritmos C ++ (algoritmo de programación dinámica)

1. Objetivo

Es el proceso de resolución del proceso de optimización del proceso de toma de decisiones.

2. Método

Descomponer el problema original en subproblemas para su solución es la idea de dividir y vencer.

3. Proceso

Hay cuatro pasos principales:

  1. Dividir subproblemas: dividir un gran problema en pequeños problemas
  2. Estado: cómo lidiar con problemas menores.
  3. Transición de estado: es decir, cómo el problema de los padres deriva el problema del niño.
  4. Determine el límite: determine cuál es el estado inicial? ¿El subproblema más pequeño? ¿Cuál es el estado final?

4. Ejemplos

(1) Likou: 5. La subcadena palíndromo más larga

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

PD: Encontré muchos problemas cuando estaba escribiendo esta parte de las preguntas, y fue muy difícil hacerlo, por desgracia.

(1) Likou: 1018. Prefijo binario divisible por 5

Por ejemplo, [0,1,1,1], el primer número es 0, el segundo número es 01, el tercero es 011 y el cuarto es 0111. Convertidos a decimal, son 0, 1, 3, 7. Luego, de acuerdo con la regla binaria, cada vez que los datos se mueven un bit hacia la izquierda, el tamaño de los datos se multiplica por 2.
Luego puede usar sum = 0, sum = sum * 2 + num. num es el elemento en [0,1,1,1] y suma es el 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;
    }
};

Luego, la operación agotó el tiempo de espera, así que la voy a transformar.
Primero, podemos transformar la suma * 2 en la suma << 1, cambiarla directamente a la posición móvil binaria y luego hacer que la suma sea igual al resto que dejó la suma 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;
    }
};

Luego, se informa un error de que el espacio de almacenamiento de los datos de tipo int no es suficiente, luego encuentre una manera de hacer que el almacenamiento int sea más pequeño.

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 la suma se divide por 5 para que la suma solo sea igual a su resto, debido a que el número adicional también es un múltiplo de cinco, la clave es ver cómo se puede procesar la parte restante de los datos.

Supongo que te gusta

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