Minimice el costo de convertir una array dada en otra al voltear columnas y reordenar filas

Dadas dos arrays binarias mat[][] y target[][] de dimensiones N * M , la tarea es encontrar el costo mínimo para convertir la array mat[][] en target[][] usando las siguientes operaciones:

  • Voltee una columna en particular en mat[][] de modo que todos los 1 se conviertan en 0 y viceversa. El coste de esta operación es de 1 .
  • Reordenar las filas de mat[][] . El coste de esta operación es 0.

Si no es posible convertir la array mat[][] a target[][] , imprima “-1” .

Ejemplos:

Entrada: mat[][] = {{0, 0}, {1, 0}, {1, 1}}, target[][] = {{0, 1}, {1, 0}, {1, 1}}
Salida: 1
Explicación:
Paso 1: Reordene las filas 2 y 3 para modificar mat [][] a {{0, 0}, {1, 1}, {1, 0}}. Costo = 0
Paso 2: Da la vuelta a la segunda columna. mat[][] se modifica a {{0, 1}, {1, 0}, {1, 1}}, que es igual a target[][]. Costo = 1

Entrada: mat[][] = {{0, 0, 0}, {1, 0, 1}, {1, 1, 0}}, target[][] = {{0, 0, 1}, { 1, 0, 1}, {1, 1, 1}}
Salida: -1

Enfoque: La idea es convertir las filas de las arrays dadas en conjuntos de bits y luego encontrar el costo mínimo de operación para igualar las arrays. A continuación se muestran los pasos:

  1. Primero, convierta las filas de mat[][] en números binarios usando un conjunto de bits.
  2. Después de completar el paso anterior, busque todas las filas posibles que puedan ser la primera fila de la array de destino.
  3. El número de giros necesarios para convertir la fila de mat[][] en tar[][] es el recuento de bits establecidos en el valor Bitwise XOR de los conjuntos de bits.
  4. Calcule Bitwise XOR de cada fila con el patrón de volteo y verifique si la nueva array, cuando se ordena, es igual a la array de destino [][] ordenada o no.
  5. Si son iguales, entonces almacena el número de vueltas.
  6. Calcule todo el recuento de lanzamientos en los pasos anteriores y devuelva el mínimo entre ellos.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
  
#include <bits/stdc++.h>
using namespace std;
  
// Custom comparator to sort vector
// of bitsets
bool static cmp(bitset<105>& p1,
                bitset<105>& p2)
{
    return p1.to_string() < p2.to_string();
}
  
// Function to convert the given
// matrix into the target matrix
int minCost(vector<vector<int> >& a,
            vector<vector<int> >& t)
{
  
    // Number of rows and columns
    int n = a.size();
    int m = a[0].size();
  
    vector<bitset<105> > mat(n), tar(n);
  
    // Iterate over rows
    for (int i = 0; i < n; i++) {
        string s;
  
        for (int j = 0; j < m; j++) {
            s += char(a[i][j] + '0');
        }
        mat[i] = bitset<105>(s);
    }
  
    // Iterate over rows
    for (int i = 0; i < n; i++) {
        string s;
  
        for (int j = 0; j < m; j++) {
            s += char(t[i][j] + '0');
        }
        tar[i] = bitset<105>(s);
    }
  
    // Sort the matrix
    sort(tar.begin(), tar.end(), cmp);
  
    int ans = INT_MAX;
  
    // Check all possible rows as the
    // first row of target
    for (int i = 0; i < n; i++) {
  
        vector<bitset<105> > copy(mat);
  
        // Get the flip pattern
        auto flip = copy[i] ^ tar[0];
  
        for (auto& row : copy)
            row ^= flip;
  
        sort(copy.begin(), copy.end(), cmp);
  
        // Number of flip operations
        // is the count of set bits in flip
        if (copy == tar)
            ans = min(ans, (int)flip.count());
    }
  
    // If it is not possible
    if (ans == INT_MAX)
        return -1;
  
    // Return the answer
    return ans;
}
  
// Driver Code
int main()
{
    // Given matrices
    vector<vector<int> > matrix{ { 0, 0 },
                                 { 1, 0 },
                                 { 1, 1 } };
  
    vector<vector<int> > target{ { 0, 1 },
                                 { 1, 0 },
                                 { 1, 1 } };
  
    // Function Call
    cout << minCost(matrix, target);
}
Producción:

1


Complejidad de Tiempo: O(N * M)
Espacio Auxiliar: O(N * M)

Publicación traducida automáticamente

Artículo escrito por rohitpal210 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *