Baekjoon-2281-데스노트
29 Sep 2022$ dp[i] = min(dp[i], (m-V[i])^2+dp[i+1], (m-V[i]-V[i+1])^2+dp[i+1],…) $
import sys
input = sys.stdin.readline
n,m = map(int, input().split())
names = [int(input()) for _ in range(n)]
infty = int(1e9)
# 뒤부터 보는 게 핵심
dp = [infty for _ in range(n)]
dp[n-1] = 0
for i in reversed(range(n-1)):
if sum(names[i:]) + len(names[i:]) - 1 <= m:
dp[i] = 0
else:
j = i+1
line_sum = names[i]
while line_sum <= m and j < n:
dp[i] = min(dp[j] + (m-line_sum)**2, dp[i])
line_sum += 1 + names[j]
j += 1
print(dp[0])