leetcode 368 dividido por el número máximo de sub-conjuntos (programación dinámica)

Divisible por sí? número máximo!

Título :
dado un conjunto de números enteros positivos y sin duplicación composición, divisible encontrar el subgrupo más grande, cualquier par de subconjuntos (Si, Sj) se tiene que cumplir: Si% Sj Sj = 0 o = 0% de Si.

Muestra :
Ejemplo 1:
Entrada: [1,2,3]
de salida: [1,2] (Por supuesto, [1,3] también correcta)
Ejemplo 2:
Entrada: [1,2,4,8]
de salida: [ 1,2,4,8]

tema de análisis

Supongamos que el máximo actual número divisible por n subgrupo
si el subconjunto puede ocurrir x == Todos los números divisibles> n + 1
aparecido! transición de estado - lo que el uso dp Solución

proceso de análisis

Set DP [i] representa el número máximo de posición i subconjunto divisible
max marcando el número máximo del subconjunto
max_id número de subconjuntos de marcadores máximo a partir
de los padres [i] en una posición de la marca es i divisible

  • En primer nums de pequeño a grande
    (nums [i] <nums [ j] ==> nums [j] ser nums [i] es divisible, entonces es divisible por nums [i] es nums divisibles capaces [j])
  • de desplazamiento de 0 i
    j i atraviese
    si los nums [j] ser los nums [i] divisible ==> DP [j] DP = [i] + 1.
    padre [i] = j - grabación de la imagen de la posición i un divisible j
  • Si mx <dp [J]
    a la actualización y mx mx_id
  • Por último, de acuerdo con la respuesta MX unirse

Código es el siguiente:

class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<int> dp(nums.size(), 0), parent(nums.size(), 0), res;
        int mx = 0, mx_idx = 0;
        for (int i = nums.size() - 1; i >= 0; --i) {
            for (int j = i; j < nums.size(); ++j) {
                if (nums[j] % nums[i] == 0 && dp[i] < dp[j] + 1) {
                    dp[i] = dp[j] + 1;
                    parent[i] = j;
                    if (mx < dp[i]) {
                        mx = dp[i];
                        mx_idx = i;
                    }
                }
            }
        }
        for (int i = 0; i < mx; ++i) {
            res.push_back(nums[mx_idx]);
            mx_idx = parent[mx_idx];
        }
        return res;
    }
};
Publicado 34 artículos originales · ganado elogios 0 · Vistas 587

Supongo que te gusta

Origin blog.csdn.net/Luyoom/article/details/103932006
Recomendado
Clasificación