문제 링크
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
풀이
처음에는 dp 테이블을
dp[n][m] : n부터 m까지의 합 으로 정의했고
dp[n][m] 이 dp[n+1][m] + 현재 위치의 값 이라는 걸 이용해서 푸는 문제인 줄 알았다..
length = int(input())
A = list(map(int,input().split()))
dp =[[-1001 for k in range(length)] for i in range(length)]
for i in range(0,length):
dp[i][i] = A[i]
for i in range(length-1,-1,-1):
for k in range(i+1, length):
dp[i][k] = dp[i+1][k] + A[i]
print(max(map(max,dp)))
그런데 이 코드로 돌리면 예제는 정답이 나오는데
메모리 초과가 났다..
그래서 질문 게시판을 좀 뒤져보니깐
애초에 2차원 리스트로 푸는 문제가 아닌것 같아서
dp[n] : n을 포함하는 최대 연속값으로 새롭게 정의했다.
그렇게 되면 dp[n] 은 dp[n-1] + 현재 위치의 값이 오거나
만약 dp[n-1] 이 지금 값보다 작다면, 그냥 현재 위치의 값이 될 것이다.
둘중 큰 수를 dp 에 채우고 dp에서 가장 큰 값을 출력하면 최대 연속합이 나온다.
length = int(input())
A = list(map(int,input().split()))
dp = [-1001] * length
dp[0] = A[0]
for i in range (1, length):
if(dp[i-1] + A[i] > A[i]):
dp[i] = dp[i-1] + A[i]
else:
dp[i] = A[i]
print(max(dp))
'알고리즘' 카테고리의 다른 글
[python] 백준 2133 : 타일 채우기 (0) | 2023.07.21 |
---|---|
[python] 백준 1699 : 제곱수 (0) | 2023.07.18 |
[python] 백준 2579 : 계단 오르기 (0) | 2023.07.17 |