Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでボードを正方形にカットするための最小コスト


長さp、幅qのボードがあるとします。このボードをp*qの正方形に分割して、分割のコストを可能な限り最小限に抑える必要があります。各エッジの切削コストが示されます。

したがって、入力がX_slice =[3,2,4,2,5]の場合、Y_slice =[5,2,3]

Pythonでボードを正方形にカットするための最小コスト

その場合、出力は65になります

これを解決するには、次の手順に従います-

  • res:=0
  • 水平:=1、垂直:=1
  • i:=0、j:=0
  • i
  • X_slice [i]> Y_slice [j]の場合、
    • res:=res + X_slice[i]*垂直
    • 水平:=水平+1
    • i:=i + 1
  • それ以外の場合、
    • res:=res + Y_slice[j]*水平
    • 垂直:=垂直+1
    • j:=j + 1
  • 合計:=0
  • i
  • 合計:=合計+ X_slice [i]
  • i:=i + 1
  • res:=res + total * vertical
  • 合計:=0
  • j
  • 合計:=合計+ Y_slice [j]
  • j:=j + 1
  • res:=res +total*水平
  • return res
  • 理解を深めるために、次の実装を見てみましょう-

    def minCost(X_slice, Y_slice, m, n):
       res = 0
       X_slice.sort(reverse = True)
       Y_slice.sort(reverse = True)
       horizontal = 1
       vertical = 1
       i = 0
       j = 0
       while i < m and j < n:
          if (X_slice[i] > Y_slice[j]):
             res += X_slice[i] * vertical
             horizontal += 1
             i += 1
          else:
             res += Y_slice[j] * horizontal
             vertical += 1
             j += 1
       total = 0
       while (i < m):
          total += X_slice[i]
          i += 1
       res += total * vertical
       total = 0
       while (j < n):
          total += Y_slice[j]
          j += 1
       res += total * horizontal
       return res
    m = 6; n = 4
    X_slice = [3,2,4,2,5]
    Y_slice = [5,2,3]
    print(minCost(X_slice, Y_slice, m-1, n-1))

    入力

    [3,2,4,2,5],[5,2,3]

    出力

    65

    1. Pythonで最小コストで都市を接続する

      1からNまでの番号が付けられたN個の都市があるとします。接続があります。各接続[i]は[city1、city2、cost]で、これはcity1とcity2を接続するためのコストを表します。 。都市のすべてのペアに対して、これら2つの都市を接続する接続パス(おそらく長さ1)が存在するように、最小コストを見つける必要があります。コストは、使用された接続コストの合計です。タスクが不可能な場合は、-1を返します。 したがって、グラフが次のような場合- その場合、出力は6になります。任意の2つの都市を選択すると、すべての都市が接続されるため、最小の2、[1、5]を選択します。 これを解決する

    2. Pythonのリーフ値からの最小コストツリー

      正の整数の配列arrがあると仮定し、次のようなすべての二分木を検討します- 各ノードには0個または2個の子があります。 arr配列の値は、ツリーを順番にトラバースする際の各リーフの値に対応します。 各非リーフノードの値は、それぞれその左サブツリーと右サブツリーの最大リーフ値の積に等しくなります。 考慮されるすべての可能な二分木の中で、各非リーフノードの値の可能な最小の合計を見つける必要があります。したがって、入力arrが[6,2,4]の場合、2つのツリーが存在する可能性があるため、出力は32になります- これを解決するには、次の手順に従います- メモと呼ばれる地図を作成する