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