Computer Science/Algorithm
[리트코드]740. Delete and Earn
suleesulee
2021. 9. 3. 23:53
class Solution:
def deleteAndEarn(self, nums: List[int]) -> int:
if not nums:
return 0
freq = [0] * (max(nums)+1)
for n in nums:
freq[n] += n
#print(freq)
dp = [0] * len(freq)
dp[1] = freq[1]
for i in range(2, len(freq)):
#print(freq[i], dp[i - 2], dp[i - 1])
dp[i] = max(freq[i] + dp[i-2], dp[i-1])
print(dp)
혼자서 풀어내지 못했다.
역시나 DP문제
나의생각방식
카운터로 모은다음에 곱해서
가장 큰 값을 기준으로 양옆보다 크면 더하고 양옆 없애버리고 아니면 그 다음 큰 것 찾고
이걸 반복하려했다
일단 구현을 하다보니 엄청 빡센거 같아서
이거 답아닌거 같은데 튀어나옴 ㅋㅋ
역시나 DP 문제였고 답을 보고 이해했다.
내가 푼 방식과 유사했지만 처음부터 더해서 최적의 값을 찾는 형식이었다...
이거 처음부터 더하는게 더 크다는 것이 수학적으로 뭔가 증명될것같은데.. 아시는분 댓글좀
아무튼 dp문제.. dp문제만 안나오면 난 뭐든지 할 수 있어
dp 천재가 되던지 dp를 던지던지 ..
나중에 다시 풀어보겠다 끗.