Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 연산 후 최대 하위 배열의 합을 찾는 프로그램

<시간/>

정수를 포함하는 배열이 주어진다고 가정합니다. array[i] 값을 제곱 값으로 바꿀 수 있는 작업을 수행할 수 있습니다. 또는 배열[i] * 배열[i]. 이러한 종류의 작업은 하나만 허용되며 작업 후 가능한 최대 하위 배열의 합계를 반환해야 합니다. 하위 배열은 비워둘 수 없습니다.

따라서 입력이 array =[4, 1, -2, -1]과 같으면 출력은 17이 됩니다.

array[0]의 값을 제곱 값으로 바꾸면 배열은 [16, 1, -2, -1]이 됩니다. 이로부터 가능한 최대 부분배열은 [16, 1]이며, 최대합값은 16 + 1 =17입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • dp1 :=음의 무한대 값을 포함하는 새 목록
  • dp2 :=음의 무한대 값을 포함하는 새 목록
  • 배열의 각 숫자에 대해 다음을 수행합니다.
    • dp1의 끝에 ((dp1의 마지막 요소 + num), num)의 최대값 삽입
    • dp2의 끝에 ((dp1의 두 번째 마지막 요소 + num^2), num^2, (dp2의 마지막 요소 + num))의 최대값 삽입
  • dp2의 최대 요소를 반환

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

def solve(array):
   dp1 = [float('-inf')]
   dp2 = [float('-inf')]
   for num in array:
      dp1.append(max(dp1[-1] + num, num))
      dp2.append(max(dp1[-2] + num**2, num**2, dp2[-1]+num))
   return max(dp2)

print(solve([4, 1, -2, -1]))

입력

[4, 1, -2, -1]

출력

17