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

Pythonで少なくともk個の奇数値を持つ最長増加部分列の長さを見つけるプログラム


numsと呼ばれる数値のリストと別の値kがあるとすると、少なくともk個の奇数要素を持つ最長増加部分列のサイズを見つける必要があります。

したがって、入力がnums =[12、14、16、5、7、8] k =2のような場合、出力は3になります。これは、少なくとも2つの奇数値を持つ最長増加部分列が[5、7 8]。

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

  • 最高:=0

  • 関数dp()を定義します。これにはi、j、odd、takenが必要です

  • 奇数>=kの場合、

    • ベスト:=ベストの最大値と取得

  • jがnumsのサイズと同じである場合、

    • 戻る

  • nums [j]> nums [i]の場合、

    • dp(j、j + 1、奇数+(nums [j] AND 1)、取得+ 1)

  • dp(i、j + 1、奇数、取得)

  • メインの方法から、次のようにします-

  • 0からnumsのサイズの範囲のiの場合、実行します

    • dp(i、i + 1、nums [i] AND 1、1)

  • 最高のリターン

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

class Solution:
def solve(self, nums, k):
   best = 0
   def dp(i, j, odd, taken):
      nonlocal best
      if odd >= k:
         best = max(best, taken)
      if j == len(nums):
         return
      if nums[j] > nums[i]:
         dp(j, j + 1, odd + (nums[j] & 1), taken + 1)
      dp(i, j + 1, odd, taken)
   for i in range(len(nums)):
      dp(i, i + 1, nums[i] & 1, 1)
   return best
ob = Solution()
nums = [12, 14, 16, 5, 7, 8]
k = 2
print(ob.solve(nums, k))

入力

[12, 14, 16, 5, 7, 8], 2

出力

3

  1. Pythonで最長のアナグラムサブシーケンスの長さを見つけるプログラム

    2つの小文字の文字列SとTがあるとすると、最長のアナグラムサブシーケンスの長さを見つける必要があります。 したがって、入力がS =helloworld、T =hellorldの場合、出力は8になります これを解決するには、次の手順に従います- c:=新しいマップ、d:=新しいマップ 0からaのサイズの範囲のiの場合、実行 cのa[i]の場合、 c [a [i]]:=c [a [i]] + 1 それ以外の場合 c [a [i]]:=1 0からbのサイズの範囲のiの場合、実行 dのb[i]の場合、 d [b [i]]:=

  2. Pythonで最も長いバランスの取れたサブシーケンスの長さを見つけるプログラム

    括弧「(」および「)」を含む文字列sがあるとすると、バランスの取れた括弧の最長のサブシーケンスの長さを見つける必要があります。 したがって、入力がs =())(()(の場合、出力は4になります。これは、 ()()のようなサブシーケンスを取ることができるためです。 これを解決するには、次の手順に従います- res:=0 n:=sのサイズ close:=0 n-1から0の範囲のiの場合、1ずつ減らします。 s[i]が)と同じ場合、 close:=close + 1 それ以外の場合 0の場合、 close:=close-1 r