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

Pythonでストーンゲームのスコアの最小差を見つけるプログラム


stones[i]が左からi番目の石の値を表すstonesという配列があるとします。 2人の友人のAmalとBimalがこれらの石を使ってターン制のゲームを再プレイし、Amalが常に最初に開始します。 n個の石が一列に並んでいます。各プレイヤーは、列から左端の石または右端の石のいずれかを削除し、列の残りの石の値の合計に等しいポイントを取得できます。より高いスコアを獲得する人が勝ちます。さて、Bimalは常にこのゲームに負けることを発見したので、スコアの差を最小限に抑えることにしました。アマルの目標は、スコアの差を最大化することです。したがって、AmalとBimalの両方が最適に再生される場合、それらのスコアの違いを見つける必要があります。

したがって、入力がstones =[6,4,2,5,3]の場合、Amalは3を取ることができるため、出力は6になります。したがって、彼のスコアは6 + 4 + 2 + 5 =17、Bimalのスコアになります。これまでのところ0であり、配列は[6,4,2,5]のようです。次に、Bimalは6を取るので、スコア4 + 2 + 5 =11になり、配列は[4,2,5]になります。次に、アマルは4を削除し、スコア17 + 2 + 5 =24、石の配列[2,5]ボブは2を削除し、スコア11 + 5 =16、現在の石の配列[5]、アマルは値5の最後の石を削除します。スコアが0になったので、彼の最終スコアは24 + 0 =24です。したがって、スコアの差は24-16=8です。

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

  • n:=石のサイズ
  • dp:=サイズnの配列で、0で埋めます
  • n-1から0の範囲のiの場合、1ずつ減らします。
    • v:=石[i]
    • run_sum:=0
    • i +1からn-1の範囲のjの場合、do
      • new_run:=run_sum + stones [j]
      • dp [j]:=(new_runの最大値-dp [j])および(run_sum + v-dp [j-1])
      • run_sum:=new_run
  • return dp [n-1]

理解を深めるために、次の実装を見てみましょう-

def solve(stones):
   n = len(stones)
   dp = [0] * n

   for i in range(n - 1, -1, -1):
      v = stones[i]
      run_sum = 0

      for j in range(i + 1, n):
         new_run = run_sum+stones[j]
         dp[j] = max(new_run - dp[j], run_sum+v - dp[j - 1])
         run_sum = new_run
   return dp[n - 1]

stones = [6,4,2,5,3]
print(solve(stones))

入力

[6,4,2,5,3]

出力

8

  1. Pythonでスティックをカットするための最小コストを見つけるためのプログラム

    値nとcutsという配列があるとします。長さn単位の木の棒があると考えてください。スティックには0からnまでのラベルが付いています。ここで、cuts [i]は、カットできる位置を表します。順番にカットする必要がありますが、カットの順番は自由に変更できます。ここで、1カットのコストはカットするスティックのサイズであり、合計コストはすべてのカットのコストの合計です。削減の最小総コストを見つける必要があります。 したがって、入力がn =7、cuts =[5,1,4,3]の場合、出力は16になります。これは、[3,5,1,4]のように注文すると、最初に長さ7から3なので、コストは7です。次に、長さ3

  2. Pythonの2つのリストから2つの要素間の最小の違いを見つけるプログラム

    L1とL2の2つのリストがあるとすると、L1の数値とL2の数値の差が最も小さいものを見つける必要があります。 したがって、入力がL1 =[2、7、4]、L2 =[16、10、11]の場合、最小の差は10-7 =3であるため、出力は3になります。 これを解決するには、次の手順に従います- リストL1を並べ替え、リストL2を並べ替えます ans:=無限大 i:=0、j:=0 i