๐Ÿ•๏ธ ICPC Sinchon/Dynamic Programming

[BOJ][C++] ๋ฐฑ์ค€ 1699๋ฒˆ: ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ

์„ ๋‹ฌ 2024. 8. 14. 03:45
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/1699

 

๋ฌธ์ œ

์–ด๋–ค ์ž์—ฐ์ˆ˜ N์€ ๊ทธ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 11=32+12+12(3๊ฐœ ํ•ญ)์ด๋‹ค. ์ด๋Ÿฐ ํ‘œํ˜„๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, 11์˜ ๊ฒฝ์šฐ 11=22+22+12+12+12(5๊ฐœ ํ•ญ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ, ์ˆ˜ํ•™์ž ์ˆŒํฌ๋ผํ…Œ์Šค๋Š” “11์€ 3๊ฐœ ํ•ญ์˜ ์ œ๊ณฑ์ˆ˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.”๋ผ๊ณ  ๋งํ•œ๋‹ค. ๋˜ํ•œ 11์€ ๊ทธ๋ณด๋‹ค ์ ์€ ํ•ญ์˜ ์ œ๊ณฑ์ˆ˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, 11์„ ๊ทธ ํ•ฉ์œผ๋กœ์จ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ๊ณฑ์ˆ˜ ํ•ญ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” 3์ด๋‹ค.

์ฃผ์–ด์ง„ ์ž์—ฐ์ˆ˜ N์„ ์ด๋ ‡๊ฒŒ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ์— ๊ทธ ํ•ญ์˜ ์ตœ์†Œ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ž์—ฐ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100,000)

์ถœ๋ ฅ

์ฃผ์–ด์ง„ ์ž์—ฐ์ˆ˜๋ฅผ ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ๋•Œ์— ๊ทธ ์ œ๊ณฑ์ˆ˜ ํ•ญ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

dp[i] = ์ˆซ์ž i์˜ ์ œ๊ณฑ์ˆ˜ ํ•ญ์˜ ์ตœ์†Œ ๊ฐฏ์ˆ˜

 

์ˆซ์ž n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ,

  • n = 1 + dp[n-1]์˜ ์ „๊ฐœ
  • n = 4 + dp[n-4]์˜ ์ „๊ฐœ
  • n = 9 + dp[n-9]์˜ ์ „๊ฐœ
  • n = 16 + dp[n-16]์˜ ์ „๊ฐœ

...

์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด n=10์ด๋ผ๋ฉด

  • 10 = 9 + dp[10-9]์˜ ์ „๊ฐœ = 9 + dp[1]์˜ ์ „๊ฐœ = 9 + (1)
    => ํ•ญ ๊ฐฏ์ˆ˜ 1+dp[1] = 2๊ฐœ 
  • 10 = 4 + dp[10-4]์˜ ์ „๊ฐœ = 4 + dp[6]์˜ ์ „๊ฐœ = 4 + (4+1+1)
    => ํ•ญ ๊ฐฏ์ˆ˜ 1+dp[6] = 4๊ฐœ
  • 10 = 1 + dp[10-9]์˜ ์ „๊ฐœ = 1 + dp[9]์˜ ์ „๊ฐœ = 1 + (9)
    => ํ•ญ ๊ฐฏ์ˆ˜ 1+dp[9] = 2๊ฐœ 

๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค

 

์ฆ‰ dp[1]~dp[n]์˜ ๊ฐ’๋งŒ ์žˆ๋‹ค๋ฉด dp[n+1]์˜ ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

n์—์„œ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋นผ์ฃผ๊ณ  ๋‚จ์€ ๊ฐ’์˜ ์ œ๊ณฑ์ˆ˜ํ•ญ ๊ฐฏ์ˆ˜์— 1์„ ๋”ํ•œ ๊ฐ’์ด n์˜ ์ œ๊ณฑ์ˆ˜ํ•ญ ๊ฐฏ์ˆ˜ ์ด๋ฏ€๋กœ

n๋ณด๋‹ค ์ž‘์€ ์ œ๊ณฑ์ˆ˜๋“ค์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋นผ์„œ ๊ณ„์‚ฐํ•ด์ฃผ๊ณ  ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•ด์„œ dp์— ์ €์žฅํ•ด์ฃผ๋ฉด ๋ !

 

// ํ’€์ด : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

const int INF = 100001;

int main() {
    int n;
    cin >> n;
    
    vector<int>dp(INF);
    dp[0] = 0;
    dp[1] = 1;
    for(int i=2; i<INF; i++) {
        int min_val = i;
        for(int j=1; j*j<=i; j++) {
            int cur = i - j*j;
            if(min_val > dp[cur]) {
                min_val = dp[cur];
            }
        }
        dp[i] = min_val+1;
    }

    cout << dp[n] << "\n";
    
    return 0;
}
๋ฐ˜์‘ํ˜•