Pythonでレンガ除去ゲームの最大スコアを見つけるプログラム
AmalとBimalがゲームをしていると仮定します。それらには、その上に番号が付けられたn個のブリックを決定する配列numsがあります。このゲームでは、プレーヤーは上から1つ、2つ、または3つのレンガを交互に削除でき、削除されたレンガにマークされた数字がそのプレーヤーのスコアに追加されます。常にAmalが最初に開始する場合、Amalが最大で安全になるスコアを見つける必要があります。
したがって、入力がnums =[1,2,3,4,5]の場合、出力は6になります。これは、Amalがブリック{1}、{1,2}、または{1,2,3}を削除できるためです。 、Amalが最初の2つまたは3つの要素を選択した場合、Bimalはすべてを取得して最大スコアを取得できますが、Amalが最初に1を選択した場合、Bimalは最大で{2,3,4} =9を取得でき、Amalは5を取得できます。アマルのスコアは1+5=6です。
これを解決するために、次の手順に従います
- INF:=9999
- n:=numsのサイズ
- リスト番号を逆にする
- temp:=サイズnの配列で、0で埋めます
- total:=サイズnの配列で、0で埋めます
- インデックスiごとに、値valをnumsで、do
- total [i]:=total [i-1] + val
- temp [0]:=nums [0]
- temp [1]:=temp [0] + nums [1]
- temp [2]:=temp [1] + nums [2]
- 3からn-1の範囲のiの場合、do
- a:=nums [i]
- b:=nums [i] + nums [i-1]
- c:=nums [i] + nums [i-1] + nums [i-2]
- temp [i]:=a、b、cの最大値
- return temp [n-1]
例
理解を深めるために、次の実装を見てみましょう-
INF = 99999 def solve(nums): n = len(nums) nums.reverse() temp = [0]*n total = [0]*n for i, val in enumerate(nums): total[i] = total[i-1] + val temp[0] = nums[0] temp[1] = temp[0]+nums[1] temp[2] = temp[1]+nums[2] for i in range(3, n): a = nums[i] b = nums[i] + nums[i-1] c = nums[i] + nums[i-1] + nums[i-2] temp[i] = max(a, b, c) return temp[n-1] nums = [1,2,3,4,5] print(solve(nums))
入力
[1,2,3,4,5]
出力
6
-
Pythonで数値を削除して最大の加法スコアを見つけるプログラム
numsという番号のリストがあるとします。数値を選択し、それを削除して、その数値とそれに隣接する2つの数値の合計でスコアを増やすことができる操作を考えてみましょう。リストの最初または最後の番号を選択しない限り、この操作を何度でも実行できる場合。可能な最大スコアを見つける必要があります。 したがって、入力がnums =[2、3、4、5、6]の場合、出力は39になり、5を選択できるため、合計は(4 + 5 + 6)=15になり、配列は[2、3、4、6]になり、次に4を選択すると、合計は(3 + 4 + 6)=13になり、配列は[2、3、6]になり、3を選択すると、合計は(2 + 3)になります。
-
Pythonで隣接するサブアレイの最大積を見つけるプログラム
numsという配列があるとすると、最大の積を持つ配列(少なくとも1つの数値を含む)内の連続するサブ配列の要素の積を見つける必要があります。したがって、配列が[1,9,2,0,2,5]の場合、連続するサブ配列[1,9,2]の積が最大になるため、出力は18になります。 これを解決するには、次の手順に従います- max_list:=サイズ番号のリスト、0で埋める min_list:=サイズ番号のリスト、0で埋める min_list:=サイズ番号のリスト、0で埋める 1からnumsの長さのiの場合 max_list [i] =max_list [i-1] * nums [i]、min_li