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 |