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

Pythonでの削除から最大のポイントを見つけるためのプログラム


正の数のリストが提供されているとします。ここで、同じ値を持つ長さtの連続するサブリストを削除して、ポイントt*tを取得できます。リストが空になるまで、これを何度でも実行できるという1つの条件を考慮する必要があります。したがって、獲得できるポイントの最大数を決定する必要があります。

したがって、入力がnums =[4、4、6、4、4]の場合、出力は17になります。

出力については、最初に長さが1で1 * 1=1ポイントを生成する6を削除できます。次に、長さが4で4 * 4 =16ポイントのリスト[4、4、4、4]を取得できます。最終的に、17ポイントを獲得できます。

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

  • 関数dp()を定義します。これは左、右、t

    になります
  • 左>右がゼロ以外の場合、

    • 0を返す

  • num:=nums [left]

  • left2:=左

  • left2

    • left2:=left2 + 1

  • t:=t + left2 −左+ 1

  • 左:=left2 + 1

  • ポイント:=tの2乗+dp(left、right、0)

  • 左から右への範囲の中間+1の場合、実行

    • nums [mid]がnumと同じ場合、

      • ポイント:=最大(ポイント、dp(左、中央− 1、0)+ dp(中央、右、t))

  • リターンポイント

  • main関数から、次のようにします-

  • print(dp(0、nums − 1、0)のサイズ)

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

class Solution:
   def solve(self, nums):
      def dp(left, right, t):
         if left > right:
            return 0
         num = nums[left]
         left2 = left
         while left2 < right and nums[left2 + 1] == num:
            left2 += 1
         t += left2 − left + 1
            left = left2 + 1
         points = t ** 2 + dp(left, right, 0)
         for mid in range(left, right + 1):
            if nums[mid] == num:
               points = max(points, dp(left, mid − 1, 0) + dp(mid, right, t))
            return points
         return dp(0, len(nums) − 1, 0)
ob1 = Solution()
print(ob1.solve([4, 4, 6, 4, 4]))

入力

[4, 4, 6, 4, 4]

出力

17

  1. グラフがPythonのすべての人によってトラバース可能かどうかを確認するプログラム

    0からn-1までの番号が付けられたn個の頂点を含むグラフが与えられたとします。グラフは無向であり、各エッジには重みがあります。グラフには3種類の重みを設定でき、各重みは特定のタスクを示します。グラフをトラバースできるのは、ジャックとケーシーの2人です。エッジの重みが1の場合、ジャックはグラフをトラバースできます。重みが2の場合、ケーシーはグラフをトラバースできます。エッジの重みが3の場合、両方がグラフをトラバースできます。グラフを両方でトラバース可能にするために必要なエッジをすべて削除する必要があります。ジャックとケーシー。グラフをトラバース可能にするために削除するエッジの数を返します。トラバ

  2. Pythonで可能なすべての有効なパスから最大スコアを見つけるプログラム

    2つの配列nums1とnums2があるとします。有効なパスは次のように定義されます- トラバースするnums1またはnums2を選択します(インデックス0から)。 配列を左から右にトラバースします。 ここで、nums1とnums2に存在する値を移動している場合は、他の配列へのパスを変更できます。ここで、スコアは有効なパスの一意の値の合計です。考えられるすべての有効なパスから取得できる最大スコアを見つける必要があります。答えが大きすぎる場合は、10 ^ 9+7を法とする結果を返します。 したがって、入力がnums1 =[3,5,6,9,11] nums2 =[5,7,9,10