본문 바로가기

BOJ 문제풀이

#1699 제곱수의 합

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