logo

Cost mínim per tallar un tauler en quadrats

Prova-ho a GfG Practice Cost mínim per tallar un tauler en quadrats' title=

Donat un tauler de dimensions n × m que s'ha de tallar en n × m quadrats. El cost de fer un tall al llarg d'una vora horitzontal o vertical es proporciona en dues matrius:

  • x[] : Reducció de costos al llarg de les vores verticals (en sentit longitudinal).
  • i[] : Reducció de costos al llarg de les vores horitzontals (ample).

Trobeu el cost total mínim necessari per tallar el tauler en quadrats de manera òptima.

Exemples: 



Entrada: x[] = [2 1 3 1 4] y[] = [4 1 2] n = 4 m = 6
Sortida: 42
Explicació:

Inicialment no. de segments horitzontals = 1 & núm. de segments verticals = 1.
La manera òptima de tallar en quadrats és:
Trieu 4 (de x) -> tall vertical Cost = 4 × segments horitzontals = 4
 Ara segments horitzontals = 1 segments verticals = 2.
Trieu 4 (de y) -> tall horitzontal Cost = 4 × segments verticals = 8
 Ara segments horitzontals = 2 segments verticals = 2.
Trieu 3 (de x) -> tall vertical Cost = 3 × segments horitzontals = 6
 Ara segments horitzontals = 2 segments verticals = 3.
Trieu 2 (de x) -> tall vertical Cost = 2 × segments horitzontals = 4
 Ara segments horitzontals = 2 segments verticals = 4.
Trieu 2 (de y) -> tall horitzontal Cost = 2 × segments verticals = 8
 Ara segments horitzontals = 3 segments verticals = 4.
Trieu 1 (de x) -> tall vertical Cost = 1 × segments horitzontals = 3
Ara segments horitzontals = 3 segments verticals = 5.
Trieu 1 (de x) -> tall vertical Cost = 1 × segments horitzontals = 3
Ara segments horitzontals = 3 segments verticals = 6.
Trieu 1 (de y) -> tall horitzontal Cost = 1 × segments verticals = 6
Ara segments horitzontals = 4 segments verticals = 6.
Per tant, el cost total = 4 + 8 + 6 + 4 + 8 + 3 + 3 + 6 = 42.

Entrada: x[] = [1 1 1] y[] = [1 1 1] n = 4 m = 4
Sortida: 15
Explicació:
Inicialment no. de segments horitzontals = 1 & núm. de segments verticals = 1.
La manera òptima de tallar en quadrats és:
Trieu 1 (de y) -> tall horitzontal Cost = 1 × segments verticals = 1
Ara segments horitzontals = 2 segments verticals = 1.
Trieu 1 (de y) -> tall horitzontal Cost = 1 × segments verticals = 1
Ara segments horitzontals = 3 segments verticals = 1.
Trieu 1 (de y) -> tall horitzontal Cost = 1 × segments verticals = 1
Ara segments horitzontals = 4 segments verticals = 1.
Trieu 1 (de x) -> tall vertical Cost = 1 × segments horitzontals = 4
Ara segments horitzontals = 4 segments verticals = 2.
Trieu 1 (de x) -> tall vertical Cost = 1 × segments horitzontals = 4
Ara segments horitzontals = 4 segments verticals = 3.
Trieu 1 (de x) -> tall vertical Cost = 1 × segments horitzontals = 4
Ara segments horitzontals = 4 segments verticals = 4
Per tant, el cost total = 1 + 1 + 1 + 4 + 4 + 4 = 15.

Taula de continguts

[Enfocament ingenu] Proveu totes les permutacions - O((n+m)!×(n+m)) Temps i O(n+m) Espai

La idea és generar totes les permutacions possibles dels talls donats i després calcular el cost de cada permutació. Finalment retornar el cost mínim entre ells.

Nota: Aquest enfocament no és factible per a entrades més grans perquè el nombre de permutacions creix factorialment com (m+n-2)!.
Per a cada permutació hem de calcular el cost en temps O(m+n). Per tant, la complexitat temporal global esdevé O((m+n−2)!×(m+n)).

[Enfocament esperat] Ús de la tècnica Greedy - O( n (log n) + m (log m)) Temps i O (1) espai

La idea és fer primer les retallades més cares utilitzant a enfocament cobdiciós . L'observació és que escollir la reducció de costos més alta a cada pas redueix els costos futurs en afectar diverses peces alhora. Ordenem els costos verticals (x) i horitzontals (y) reduïts en ordre descendent i després triem iterativament el més gran per maximitzar l'estalvi de costos. Els talls restants es processen per separat per garantir que totes les seccions es divideixen de manera òptima.

Què passa quan fem un tall?

  • Tall horitzontal → esteu tallant l'amplada de manera que augmenta el nombre de tires horitzontals (hCount++). Però el cost es multiplica per vCount (el nombre de tires verticals) perquè el tall horitzontal ha de passar per tots els segments verticals.
  • Tall vertical → esteu tallant l'alçada de manera que el nombre de tires verticals augmenta (vCount++). Però el cost es multiplica per hCount (el nombre de tires horitzontals) perquè el tall vertical ha de passar per tots els segments horitzontals.

Passos per resoldre el problema:

  • Ordena les matrius x i y en ordre descendent.
  • Fes servir dos punters un per x i un per y començant pel valor més gran i avançant cap a valors més petits.
  • Manteniu hCount i vCount per fer un seguiment de quants segments afecta cada tall i actualitzar-los en conseqüència.
  • Itereu mentre que x i y tinguin retallades sense processar sempre escollint el cost més per minimitzar les despeses generals.
  • Si x li queden talls processeu-los amb hCount multiplicador; De la mateixa manera, processeu els retalls i restants amb vCount.
  • Acumuleu cost total a cada pas mitjançant la fórmula: reduïu el cost * nombre de peces afectades per garantir un cost mínim.
C++
#include   #include #include   using namespace std; int minCost(int n int m   vector<int>& x vector<int>& y) {    // Sort the cutting costs in ascending order  sort(x.begin() x.end());  sort(y.begin() y.end());   int hCount = 1 vCount = 1;   int i = x.size() - 1 j = y.size() - 1;   int totalCost = 0;  while (i >= 0 && j >= 0) {    // Choose the larger cost cut to   // minimize future costs  if (x[i] >= y[j]) {  totalCost += x[i] * hCount;   vCount++;  i--;  }   else {  totalCost += y[j] * vCount;   hCount++;  j--;  }  }  // Process remaining vertical cuts  while (i >= 0) {  totalCost += x[i] * hCount;  vCount++;  i--;  }  // Process remaining horizontal cuts  while (j >= 0) {  totalCost += y[j] * vCount;  hCount++;  j--;  }  return totalCost; } int main() {    int n = 4 m = 6;  vector<int> x = {2 1 3 1 4};  vector<int> y = {4 1 2};  cout << minCost(n m x y) << endl;  return 0; } 
Java
import java.util.Arrays; class GfG {    static int minCost(int n int m   int[] x int[] y) {    // Sort the cutting costs in ascending order  Arrays.sort(x);  Arrays.sort(y);   int hCount = 1 vCount = 1;   int i = x.length - 1 j = y.length - 1;   int totalCost = 0;  while (i >= 0 && j >= 0) {    // Choose the larger cost cut to   // minimize future costs  if (x[i] >= y[j]) {  totalCost += x[i] * hCount;   vCount++;  i--;  }   else {  totalCost += y[j] * vCount;   hCount++;  j--;  }  }  // Process remaining vertical cuts  while (i >= 0) {  totalCost += x[i] * hCount;  vCount++;  i--;  }  // Process remaining horizontal cuts  while (j >= 0) {  totalCost += y[j] * vCount;  hCount++;  j--;  }  return totalCost;  }  public static void main(String[] args) {    int n = 4m = 6;  int[] x = {2 1 3 1 4};  int[] y = {4 1 2};  System.out.println(minCost(n m x y));  } } 
Python
def minCost(nm x y): # Sort the cutting costs in ascending order x.sort() y.sort() hCount vCount = 1 1 i j = len(x) - 1 len(y) - 1 totalCost = 0 while i >= 0 and j >= 0: # Choose the larger cost cut to  # minimize future costs if x[i] >= y[j]: totalCost += x[i] * hCount vCount += 1 i -= 1 else: totalCost += y[j] * vCount hCount += 1 j -= 1 # Process remaining vertical cuts while i >= 0: totalCost += x[i] * hCount vCount += 1 i -= 1 # Process remaining horizontal cuts while j >= 0: totalCost += y[j] * vCount hCount += 1 j -= 1 return totalCost if __name__ == '__main__': nm = 4 6 x = [2 1 3 1 4] y = [4 1 2] print(minCost(nmx y)) 
C#
using System; class GfG {  public static int minCost(int n int m   int[] x int[] y) {    // Sort the cutting costs in ascending order  Array.Sort(x);  Array.Sort(y);  int hCount = 1 vCount = 1;  int i = x.Length - 1 j = y.Length - 1;  int totalCost = 0;  // Process the cuts in greedy manner  while (i >= 0 && j >= 0) {    // Choose the larger cost cut to   // minimize future costs  if (x[i] >= y[j]) {  totalCost += x[i] * hCount;  vCount++;  i--;  }  else {  totalCost += y[j] * vCount;  hCount++;  j--;  }  }  // Process remaining vertical cuts  while (i >= 0) {  totalCost += x[i] * hCount;  vCount++;  i--;  }  // Process remaining horizontal cuts  while (j >= 0) {  totalCost += y[j] * vCount;  hCount++;  j--;  }  return totalCost;  }    public static void Main() {    int n=4m=6;  int[] x = {2 1 3 1 4};  int[] y = {4 1 2};  Console.WriteLine(minCost(nm x y));  } } 
JavaScript
function minCost( nm x y) {    // Sort the cutting costs in ascending order  x.sort((a b) => a - b);  y.sort((a b) => a - b);  let hCount = 1 vCount = 1;  let i = x.length - 1 j = y.length - 1;  let totalCost = 0;  while (i >= 0 && j >= 0) {    // Choose the larger cost cut to   // minimize future costs  if (x[i] >= y[j]) {  totalCost += x[i] * hCount;  vCount++;  i--;  }   else {  totalCost += y[j] * vCount;  hCount++;  j--;  }  }  // Process remaining vertical cuts  while (i >= 0) {  totalCost += x[i] * hCount;  vCount++;  i--;  }  // Process remaining horizontal cuts  while (j >= 0) {  totalCost += y[j] * vCount;  hCount++;  j--;  }  return totalCost; } // Driver Code let n = 4m = 6; let x = [2 1 3 1 4]; let y = [4 1 2]; console.log(minCost(nm x y)); 

Sortida
42