์‹ค๋ฒ„5 : ๋™์  ๊ณ„ํš๋ฒ• ๋ฌธ์ œ์ด๋‹ค.

์ƒ๊ฐ

์ƒ๊ฐ ๋ณด๋‹ค ํž˜๋“ค๊ฒŒ ํ‘ผ ๋ฌธ์ œ์ด๋‹ค. n์ด 50000์ด๊ณ , ์‹œ๊ฐ„ ์ œํ•œ์ด 0.5์ดˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํƒ์ƒ‰์œผ๋กœ ํ’€๋ฉด ํž˜๋“ค ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋™์  ๊ณ„ํš๋ฒ• ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์ด๋ฅผ ์ฑ„ํƒํ–ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ๋™์ „ ๋ฌธ์ œ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋ช‡๊ฐœ์˜ ์ œ๊ณฑ์ˆ˜๊ฐ€ ์ตœ์†Œ๋กœ ํ•„์š”ํ•˜๋ƒ๋Š” ๋ฌธ์ œ์ธ๋ฐ, ์‚ฌ์‹ค 1๋กœ ๋ชจ๋“  ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ํ•ด์ง€๋Š” ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ ์ตœ์†Œ ๊ฐœ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋งž๋‹ค.

์ •์˜

dp[i] = i์„ ๋งŒ๋“œ๋Š”๋ฐ ์žˆ์–ด ํ•„์š”ํ•œ ์ตœ์†Œ ์ˆซ์ž์˜ ๊ฐฏ์ˆ˜

์ •์˜๋Š” 1์ฐจ์› ๋‹ค์ด๋‚˜๋ฏน์ด์ง€๋งŒ, ๊ณ„์† ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ 4๋ฒˆํ•˜๋ฉด i์„ ๋งŒ๋“œ๋Š”๋ฐ ์žˆ์–ด ํ•„์š”ํ•œ ์ตœ์†Œ ์ œ๊ณฑ์ˆ˜์˜ ๊ฐฏ์ˆ˜ ๋กœ ์ •๋ฆฌ๋  ์ˆ˜ ์žˆ๋‹ค. (๋ฌธ์ œ์— ์ด๋ฏธ ์ฆ๋ช…๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค)

์ ํ™”์‹

dp[i] = min(dp[i], dp[j*j]+dp[i-j*j])

์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž. n์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋Š” dp[n-i*i]๋กœ ๋ถ€ํ„ฐ ์˜ฌ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ œ๊ณฑ์ˆ˜๋ฅผ ๋”ํ•˜์—ฌ ํ•ด๋‹น ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

n = n-1*1 + 1*1
  = n-2*2 + 2*2
  = n-3*3 + 3*3
  ...
  = n-sqrt(n)*sqrt(n) + sqrt(n)*sqrt(n)

๊ทธ๋ ‡๋‹ค๋ฉด, dp์—ญ์‹œ ์ด ๊ด€๊ณ„๊ฐ€ ์ ์šฉ๋˜๋‚˜ ์ƒ๊ฐํ•ด๋ณด์ž. 9์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” (8์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜ + 1์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜) ๊ทธ๋ฆฌ๊ณ  (5์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜ + 4์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜), (3์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜ + 0์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜)๋ฅผ ๋น„๊ตํ•˜๋ฉด ๋œ๋‹ค. ์ด ๋•Œ ๋’ค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ๊ฐœ์ˆ˜(1, 4, 0)์€ ๋ชจ๋‘ ์ œ๊ณฑ์ˆ˜ ์ด๋‹ค. ํ•˜์ง€๋งŒ ์•ž์€ ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋ณด๋‹ค ํฐ ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณ„์†ํ•ด์„œ ์ˆซ์ž๊ฐ€ ์ž‘์•„์ง€๊ณ , ์ด๊ฒƒ์€ ๋ฌธ์ œ์—์„œ ์ฆ๋ช…๋œ ์‚ฌ์‹ค๊ณผ ๊ฐ™์ด 4๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋‹ค. ์„ค๋ช…์ด ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค

||0|1|2|3|4|5|6|7|8|9| |::|:|:|:|:|:|:|:|:|:|:| |1|0|1|2|3|1|5|6|7|8|1| |2|0|1|2|3|1|2|3|4|2|1| |3|0|1|2|3|1|2|3|0|0|1| |4|0|1|2|3|1|2|3|0|0|1|

1์€ ํ•œ๋ฒˆ์˜ ์ œ๊ณฑ์ˆ˜๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค. 5๋Š” ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ดˆ๊ธฐ๊ฐ’์„ INF๋กœ ์žก๋Š”๋‹ค. ๊ทธ ๋‹ค์Œ์œผ๋กœ 2๊ฐœ์˜ ์ˆซ์ž๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํ•„์š”ํ•œ ๊ฐœ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. (1, 4), (2, 3)์—์„œ ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, dp๊ฐ’์„ ๋”ํ–ˆ์„ ๋•Œ ์ตœ์†Ÿ๊ฐ’์ด 2์ด๋ฏ€๋กœ 5๋Š” 2๊ฐœ์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ 2๊ฐœ๋ฅผ ๋”ํ•˜๋ฉด ๋งŒ๋“ค์–ด์ง„๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋‘๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด, 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ํ•„์š”ํ•œ ์ œ๊ณฑ์ˆ˜์˜ ์ตœ์†Œ๊ฐœ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค. 3๊ฐœ์˜ ์ˆซ์ž๊นŒ์ง€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ์ „ํžˆ ๋ฐฉ๋ฒ•์„ ๋˜‘๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ dp์— ์žˆ๋Š” ๊ฐ’์€ ๊ทธ ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ๋Œ€๋ณ€ํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ ์ตœ์†Œ ๊ฐœ์ˆ˜๋กœ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ m๊ฐœ์˜ ์ˆซ์ž๊นŒ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ตœ์†Œ์ˆซ์ž์˜ ๊ฐœ์ˆ˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์—ด ๋ฐฉํ–ฅ์œผ๋กœ๋„ dp์˜ ์ •์˜๊ฐ€ ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 4๋ฒˆ์งธ ์ˆซ์ž๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ์„๋•Œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋‹ต์ด๋‹ค.

Code

#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF = 1e9;
int N;
int dp[50001];
 
int main(){
    cin >> N;
    fill(dp, dp+N+1, INF);
    for (int i = 1; i <= N; i++) {
        if (int(sqrt(i))*int(sqrt(i)) == i) dp[i] = 1;
        else dp[i] = i;
    }
    for (int k = 0; k < 3; k++) {
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= int(sqrt(i)); j++) {
                dp[i] = min(dp[i], dp[j*j]+dp[i-j*j]);
            }
        }
    }
    cout << dp[N] << '\n';
}
 
//
//  main.cpp
//  test
//
//  Created by ์ตœ์™„์‹ on 2021/03/15.
//
 
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF = 1e9;
 
int main(){
    int n;
    int dp[50001];
    
    cin >> n;
    fill(dp, dp+n+1, INF);
    
    int i = 1;
    while(true) {
        if (i*i > 50000) {
            break;
        }
        dp[i*i] = 1;
        i++;
    }
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= int(sqrt(i)); j++) {
            dp[i] = min(dp[i], dp[i-j*j] + dp[j*j]);
        }
    }
    cout << dp[n] << endl;
    
    return 0;
}
 

Reference

๋ฐฑ์ค€(17626๋ฒˆ) - Four Squares{: target=โ€œ_blankโ€}