[Aprendizaje] ejercicios Leetcode algoritmo de programación dinámica

estructura Consideración claramente programación dinámica comienza alrededor de comparación, el mismo pensamiento cuando el primer enfoque de arriba abajo, de abajo hacia arriba y luego doble bucle inverso +, deriva de programación dinámica.

343. rotura Entero

Recursiva Core Sub-Arquitectura
Recursivo método de búsqueda + plan de
arriba hacia abajo

// 递归+记忆化搜索 
class Solution {
private:
    vector<int> memo;
    int max3(int a, int b, int c){
        return max(a, max(b,c));
    }

    int breakInteger(int n){
        if(n==1)
            return 1;
        if(memo[n] != -1)  
            return memo[n];   //返回记录

        int res = -1;
        for(int i=1; i<=n-1; ++i)
            res = max3(res, i * (n-i) ,i * breakInteger(n-i));  // 重叠子问题
        memo[n] = res;
        return res;
    }

public:
    int integerBreak(int n) {
        assert(n>=2); //出于严谨考虑,让n>=2,其实根据提议要至少2部分。
        // 调用这个函数的时候,对memo进行初始化
        memo = vector<int>(n+1, -1); //n的问题,初始化为n+1个元素)
        return breakInteger(n);  //递归方法
    }
};

Programación Dinámica Método para
abajo hacia arriba
complejidad visto del algoritmo es O (n ^ 2)

// 我自己写的动态规划!
class Solution {
private:
    vector<int> memo;
public:
    int integerBreak(int n) {
        assert(n>=2); //出于严谨考虑,让n>=2,其实根据提议要至少2部分。
        // 调用这个函数的时候,对memo进行初始化
        memo = vector<int>(n+1, -1); //n的问题,初始化为n+1个元素)
        memo[1] = 1;
        memo[2] = 1;
        for(int i=3; i<=n; ++i){
            int res = -1; //用于之后计算memo[i]的最大值
            for(int j=1; j<=i-1; ++j){
                int temp = max(j*memo[i-j],  j*(i-j)); //找出当前这步最大
                if(temp>res)
                    res=temp;
            }
            memo[i] = res;
        }
        return memo[n];

    }
};

optimización profesor: con una mayor compresión se requiere max (nota [i]) de!

// 老师写的动态规划!
class Solution {
private:
    int max3(int a, int b, int c){
        return max(a, max(b,c));
    }

public:
    int integerBreak(int n) {
        assert(n>=2); 
        vector<int> memo(n+1,-1);
        memo[1] = 1;
        
        for(int i=2; i<=n; ++i)
            for(int j=1; j<=i-1; ++j)
                // //找出当前这步最大
                memo[i] = max3(memo[i], j*memo[i-j],  j*(i-j) );  
                
       return memo[n];         
    }
    
};

La comprensión: estado, transición de estado
del estado - la definición de ¿qué función (lo que en nombre de la función)
la transición de estado - ¿Cómo funcionan

198 Casa ladrón

Sus iniciales en forma recursiva:
definición de función (estado): nums robo Dadas [índice, ... nums.size () ] en el rango de toda la casa

class Solution {
private:
    // memo[i]表示考虑抢劫nums[i...n]所能获得的最大收益
    // memo[i]和tryRob状态的定义是一致的!
    vector<int> memo;

    // 函数定义(状态):考虑抢劫nums[index, .... nums.size()]范围内的所有房子
    int tryRob(vector<int> &nums, int index){

        //递归终止条件
        if(index >= nums.size())
            return 0;
        if(memo[index] != -1)
            return memo[index];

        int res = 0;
        for(int i=index;i<nums.size(); ++i){  
            res = max(res, nums[i] + tryRob(nums, i+2));
        }
        memo[index] = res;
        return res;
    }
public:
    int rob(vector<int>& nums) {
        memo = vector<int>(nums.size(), -1);
        return tryRob(nums, 0);
    }
};

modo de programación dinámica:
que se puede dividir de esta manera:

  1. Aquí con un doble circulación;
    buen criterio sobre el uso de la diferencia entre el ciclo de pesada doble y de un solo ciclo a.
  2. Memo [i] en el modo de adquisición;
    memo medios [i] que: la i-ésima posición del valor máximo para empezar a robar! Así que debe haber un proceso de máximo! (Max toma una habilidad!)
    memo[i] = nums[j] + memo[j+2];

Entonces objetivo es encontrar la nota [i] de la máxima, por lo que con la punta:
memo[i] = max(memo[i], nums[j] + memo[j+2])
Entonces recuerdo teniendo en cuenta los límites de la matriz detalle ver el código de abajo!

int rob(vector<int> &nums){
        int n = nums.size();
        if(n==0)
            return 0;

        vector<int> memo(n, -1);
        memo[n-1] = nums[n-1];
        // 递推解决
        for(int i=n-2; i>=0; --i)
            for(int j=i; j<n; j++)
                // 关键这一步,然后max也找出了memo[i]最大值
                memo[i] = max(memo[i], nums[j] + (j+2<n ? memo[j+2]:0));

        return memo[0];
    }
Publicado 63 artículos originales · elogios ganado 13 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/changreal/article/details/102542438
Recomendado
Clasificación