728x90
반응형
https://www.acmicpc.net/problem/1699
일단 dp[i]의 값을 i를 제곱수들의 합으로 표현할 때 최소 개수로 정한다.
그렇게 되면 dp[i]의 값은
dp[1] + dp[i-1]
dp[2] + dp[i-2]
dp[3] + dp[i-3]
.
.
.
위 값들 중 가장 작은 값이 된다.
처음엔 위 방식으로 이중 반복문을 돌려서 답을 구했으나 시간 초과가 발생했다.
시간을 더 줄일 수 있는 알고리즘을 사용해야한다.
먼저 항의 개수가 최소가 되는 조건을 찾아야한다.
1, 4, 9 같은 제곱수의 경우 무조건 최소 항의 개수가 1이다.
그러므로 dp[i]의 값을 구할 때
dp[1] + dp[i-1]
dp[4] + dp[i-4]
dp[9] + dp[i-9]
.
.
.
위와 같이 제곱으로 건너뛰면 더욱 빠르게 구할 수 있다.
n = int(input())
dp = [1e9]*(n+1)
dp[1]=1
sq=[1]
for i in range(2, n+1):
if int(i**0.5)**2==i:
sq.append(i)
dp[i]=1
else:
for j in sq:
dp[i]=min(dp[i],dp[j]+dp[i-j])
print(dp[n])
728x90
반응형
'백준 알고리즘 > dp' 카테고리의 다른 글
[백준 11066][파이썬] 파일 합치기 (dp 알고리즘) (0) | 2023.03.15 |
---|---|
[백준 2839][파이썬] 설탕 배달 (0) | 2023.01.23 |
[백준 1912][파이썬] 연속 합 (0) | 2023.01.13 |
[백준 11055, 11722, 11054][파이썬] 증가, 감소하는 수열 dp 문제 (0) | 2023.01.11 |
[백준][파이썬] 쉬운 계단 수 10844 (0) | 2023.01.09 |
댓글