https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
실버 3의 문제였다. 디피는 항상 등록된(?) 티어보다 어려운것 같다.
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
long long dp[100001];
int main()
{
//freopen("input.txt","r",stdin);
int n;
cin>>n;
int num;
for(int i=1;i<=n;i++){
dp[i]=i;
for(int j=1;j*j<=i;j++){
if(dp[i]>dp[i-j*j]+1)
dp[i] = dp[i-j*j]+1;
}
}
cout<<dp[n];
}
풀이 과정은 다음과 같다.
dp[i] = i를 제곱수의 합으로 나타내었을때, 필요한 항의 최소 개수 라고 한다.
이때 마지막항에 오는 수가 중요하고, 마지막 항이 1일때, 4일때, 9일때 .... 로 계산한다.
마지막 항이 1일때: dp[i]=dp[i-1] + 1
마지막 항이 4일때: dp[i]=dp[i-4] + 1
마지막 항이 9일때: dp[i]=dp[i-9] + 1
....
이 중 최소 개수를 구해야 하므로, dp[i]=min(dp[i-j^2] + 1) 으로 쓸 수 있다.
이 문제도 마지막항을 잘 쳐다보면 그렇게 어렵지 않게 해결 할 수 있는 문제였다.
'BOJ 문제풀이' 카테고리의 다른 글
#1309 동물원 (0) | 2022.05.01 |
---|---|
#2583 영역 구하기 (0) | 2022.04.29 |
#1149 RGB거리 (0) | 2022.04.27 |
#11727 2xn 타일링 2 (0) | 2022.04.26 |
#2193 이친수 (0) | 2022.04.18 |