N,K = map(int,input().split()) arr = list(map(int,input().split())) dp = [0]*(N+1) result = 0 left = 0 right = 0 sum_temp = 0 while right <=N: if sum_temp >=K: while sum_temp >= K: dp[right] = max(dp[right],dp[left]+sum_temp-K) sum_temp -= arr[left] left += 1 else: dp[right] = max(dp[right],dp[right-1]) if right == N: break sum_temp += arr[right] right += 1 print(dp[N])
import sys sys.setrecursionlimit(100001) def find_min_right_over_k(left): global K low = left -1 high = N while low + 1 < high: mid = (low+high)//2 if prefix_sum[mid] - prefix_sum[left-1] >=K: high = mid else: low = mid return high def solution(left): if left > N: return 0 if dp[left] != -1: return dp[left] pass_hear_value = solution(left+1) right = find_min_right_over_k(left) eat_left_right = prefix_sum[right]-prefix_sum[left-1]-K+solution(right+1) max_value = max(pass_hear_value,eat_left_right) dp[left] = max_value return dp[left] N,K = map(int,input().split()) arr = list(map(int,input().split())) dp = [-1]*(N+1) prefix_sum = [0]+arr[:] for k in range(1,N+1): prefix_sum[k] += prefix_sum[k-1] print(solution(1))
'알고리즘 > 백준_복기_미완료' 카테고리의 다른 글
[BOJ/백준] 20937 떡국 (0) | 2021.05.07 |
---|---|
[BOJ/백준] 20300 서강근육맨 (0) | 2021.05.07 |
[BOJ/백준] 20119 클레어와 물약 (0) | 2021.05.07 |
[BOJ/백준] 20114 미아노트 (0) | 2021.05.07 |
[BOJ/백준] 20061 모노미노도미노 2 (0) | 2021.05.07 |