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

Pythonで重複しない2つのサブリストの最大合計を見つけるプログラム


numsと呼ばれる数値のリストと2つの値xおよびyがあるとすると、長さxおよびyを持つnums内の重複しない2つのサブリストの最大合計を見つける必要があります。

したがって、入力がnums =[3、2、10、-2、7、6] x =3 y =1の場合、出力は22になります。これは、長さが3のサブリストとして[3、2、 10]と、その他には[7]を選択します。

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

  • P:=単一要素0のリスト
  • Aのxごとに、
    • Pの最後に(P + xの最後の要素)を挿入します
  • 関数solve()を定義します。これにはlen1、len2が必要です
  • Q:=範囲0からP-len1のサイズまでの各iの要素(P [i + len1]-P [i])を含むリスト
  • プレフィックス:=Qのコピー
  • 0からプレフィックス-1のサイズまでの範囲のiの場合、do
    • prefix [i + 1]:=プレフィックス[i+1]とプレフィックス[i]の最大値
  • ans:=-infinity
  • len1からP-len2のサイズの範囲のiの場合、
    • 左:=プレフィックス[i-len1]
    • 右:=P [i + len2]-P [i]
    • ans:=ansの最大値と(左+右)
  • 回答を返す
  • メインの方法から次のようにします-
  • solve(len1、len2)、solve(len2、len1)の最大値を返す

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

class Solution:
   def solve(self, A, len1, len2):
      P = [0]
      for x in A:
         P.append(P[-1] + x)
      def solve(len1, len2):
         Q = [P[i + len1] - P[i] for i in range(len(P) - len1)]
         prefix = Q[:]
         for i in range(len(prefix) - 1):
            prefix[i + 1] = max(prefix[i + 1], prefix[i])
            ans = float("-inf")
            for i in range(len1, len(P) - len2):
               left = prefix[i - len1]
               right = P[i + len2] - P[i]
            ans = max(ans, left + right)
            return ans
         return max(solve(len1, len2), solve(len2, len1))
ob = Solution()
nums = [3, 2, 10, -2, 7, 6]
x = 3
y = 1
print(ob.solve(nums, x, y))

入力

[3, 2, 10, -2, 7, 6], 3, 1

出力

22

  1. Pythonでツリーの隣接していないノードの最大合計を見つけるプログラム

    二分木があるとすると、2つの値が親から子に隣接できない場合に、取得できる値の最大合計を見つける必要があります。 したがって、入力が次のような場合 10、4、3が互いに隣接していないため、出力は17になります。 これを解決するには、次の手順に従います- 関数f()を定義します。これはノードを取ります ノードがnullの場合、 return(0、0) (a、b):=f(ノードの左側) (c、d):=f(ノードの右側) ペアを返します(ノード+ b+dとa+c、a + cの値の最大値) メインメソッドからf(root)を呼び出し、その最初の値を返します 理解を深めるために、次

  2. いいえが2の累乗であるかどうかを調べるPythonプログラム

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数値が与えられているので、その数値が2の累乗であるかどうかを確認する必要があります。 これは、以下で説明する2つのアプローチを使用して解決できます。 アプローチ1:2進数で指定された数値の対数を取り、電力を取得します 例 # power of 2 def find(n):    if (n == 0):       return False    while (n != 1):       if (n %