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

[BOJ][C++] ๋ฐฑ์ค€ 2421๋ฒˆ: ์ €๊ธˆํ†ต

์„ ๋‹ฌ 2024. 9. 24. 22:56
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

ํ™ํƒœ์„์€ ์ €๊ธˆํ†ต 2๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ™ํƒœ์„์€ ๋งค์ผ๋งค์ผ ํ•˜๋‚˜์˜ ์ €๊ธˆํ†ต์— 1์›์„ ๋„ฃ๋Š”๋‹ค. ๋‘ ์ €๊ธˆํ†ต์— ๋ชจ๋‘ N์›์ด ๋ชจ์ด๋ฉด ํƒœ์„์ด๋Š” ์ƒˆ๋กœ์šด ์žฅ๋‚œ๊ฐ์„ ์‚ด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ €๊ธˆ์„ ๋ฉˆ์ถ˜๋‹ค.

ํ™ํƒœ์„์€ ์†Œ์ˆ˜๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„œ๊ฐ•๋Œ€์—์„œ ์œ ๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฒซ์งธ ์ €๊ธˆํ†ต์— ๋“ค์–ด์žˆ๋Š” ๋ˆ์˜ ์–‘๊ณผ ๋‘˜์งธ ์ €๊ธˆํ†ต์˜ ๋ˆ์˜ ์–‘์„ ์ด์–ด๋ถ™์˜€์„ ๋•Œ, ๊ทธ๊ฒƒ์ด ์†Œ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋„ˆ๋ฌด๋‚˜๋„ ์ข‹์•„ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฒซ์งธ ์ €๊ธˆํ†ต์— 12์›์ด ์žˆ๊ณ , ๋‘˜์งธ ์ €๊ธˆํ†ต์— 7์›์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿผ ๊ทธ ๋‘ ์ˆ˜๋ฅผ ์ด์€ 127์€ ์†Œ์ˆ˜๊ฐ€ ๋œ๋‹ค.

์ด์ œ, ์ตœ๋Œ€ํ•œ ์†Œ์ˆ˜๊ฐ€ ๋งŽ์ด ๋‚˜์˜ค๋„๋ก, ํ™ํƒœ์„์ด ๋ˆ์„ ๋„ฃ๋Š” ์ตœ์ ์˜ ์ˆœ์„œ๋ฅผ ์ฐพ์•„๋‚ด๋ฉด ๋œ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋‘ ์ €๊ธˆํ†ต์—๋Š” 1์›์”ฉ ๋“ค์–ด์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,  N=4์ผ ๋•Œ๋ฅผ ๋ณด์ž.

1,1 → 2,1 → 2,2 → 3,2 → 3,3 → 4,3 → 4,4

์œ„์™€๊ฐ™์ด ๋ˆ์„ ๋„ฃ์œผ๋ฉด ์†Œ์ˆ˜๋Š” ์˜ค์ง 1๋ฒˆ ๋“ฑ์žฅํ•œ๋‹ค. (43)

ํ•˜์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ˆ์„ ๋„ฃ์œผ๋ฉด ์†Œ์ˆ˜๋Š” 3๋ฒˆ (31,41,43) ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

1,1 → 2,1 → 3,1 → 4,1 → 4,2 → 4,3 → 4,4

์œ„์˜ ์˜ˆ๊ฐ€ N=4์ผ ๋•Œ ์˜ ๋‹ต์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— 11์€ ์„ธ์ง€ ์•Š๋Š”๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1<=N<=999)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์†Œ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜์˜ค๋Š” ์ €๊ธˆ ๋ฐฉ๋ฒ•์—์„œ ์†Œ์ˆ˜๊ฐ€ ๋‚˜์˜ค๋Š” ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

[i, j] ๋Š” ๋ฌด์กฐ๊ฑด [i-1, j] ๋‚˜ [i, j-1] ๋‘˜ ์ค‘ ํ•œ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์„œ ์˜จ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด [i,j]๋Š” ์ € ๋‘ ๊ฒฝ์šฐ๊ฐ€ ๊ฑฐ์ณ์˜ค๋ฉด์„œ ๊ฐ€์ง„ ์†Œ์ˆ˜์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค

๊ทธ๋ฆฌ๊ณ  [i,j]๋„ ์†Œ์ˆ˜๋ผ๋ฉด ๊ทธ ๊ฐฏ์ˆ˜์— 1์„ ๋”ํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

์ฆ‰, dp ๋ฌธ์ œ๋‹ค. ๊ทผ๋ฐ ์ด์ œ 2์ฐจ์›์„ ๊ณ๋“ค์ธ..

 

2์ฐจ์› ๋ฒกํ„ฐ dp๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

dp[i][j] = i์™€ j๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฐ’์ด ๋˜๊ธฐ๊นŒ์ง€ ๋‚˜์˜จ ์†Œ์ˆ˜์˜ ๊ฐฏ์ˆ˜

์ด์ค‘ for๋ฌธ์œผ๋กœ ๊ฐ ํ•ญ์„ ๋Œ๋ฉด์„œ ์ง์ „ ๋‹จ๊ณ„ ๋‘๊ฐœ([i-1,j] [i,j-1])๋ฅผ ๋น„๊ตํ•˜๋ฉด์„œ dp๋ฅผ ์ˆ˜ํ–‰ํ•˜์ž

๋‘ ๋‹จ๊ณ„์ค‘ ๋” ํฐ ๊ฐ’์„ ๊ณ ๋ฅด๊ณ , ๋งŒ์•ฝ [i,j]๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด 1์„ ๋”ํ•ด์ค€๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ํ•ญ([i,j])์ด ์†Œ์ˆ˜์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์•„ํ•œ๋‹ค.

2์ฐจ์› ๋ฒกํ„ฐ v๋ฅผ ๋˜ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

v[i][j] = i์™€ j๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฐ’์ด ์†Œ์ˆ˜์ธ๊ฐ€

 

v๋ฅผ ์ฑ„์šฐ๋ ค๋ฉด i์™€ j๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฐ’์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค.

๋‘ ์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด์„œ ๋ถ™์—ฌ์ฃผ๊ณ  ์ด๋ฅผ ๋‹ค์‹œ ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ–ˆ๋‹ค.

int connectedNum(int a, int b) {
    return stoi(to_string(a) + to_string(b));
}

 

์ด์ œ ํŠน์ • ์ˆ˜๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ์—ฌ๋ถ€๋„ ์•Œ์•„์•ผํ•œ๋‹ค. ๋ฒกํ„ฐ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์ž

isPrime[i] : i๊ฐ€ ์†Œ์ˆ˜์ธ๊ฐ€?

    isPrime.assign(maxValue, true);
    isPrime[1] = false;
    for(int i=2; i*i<=maxValue; i++) {
        if(!isPrime[i]) {
            continue;
        }
        for(int j=i*i; j<=maxValue; j+=i) {
            isPrime[j] = false;
        }
    }

 

์ฐธ๊ณ ๋กœ n์˜ ์ตœ๋Œ“๊ฐ’์ด 999๋‹ค

์ด ๊ฒฝ์šฐ 999999๋ผ๋Š” ์ˆ˜๊นŒ์ง€ ์†Œ์ˆ˜ ์—ฌ๋ถ€๋ฅผ ๊ตฌํ•ด๋†”์•ผ ์ œ๋Œ€๋กœ ์จ๋จน์„ ์ˆ˜ ์žˆ๋‹ค

isPrime์„ n๊นŒ์ง€๋งŒ ๊ตฌํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž

    int maxValue = connectedNum(n,n);

 

 

์ฝ”๋“œ

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

#include <iostream>
#include <vector>

using namespace std;

vector<bool>isPrime;

int connectedNum(int a, int b) {
    return stoi(to_string(a) + to_string(b));
}

int main() {
    int n;
    cin >> n;
    
    // isPrime[i] : i๊ฐ€ ์†Œ์ˆ˜์ธ๊ฐ€?
    int maxValue = connectedNum(n,n);
    isPrime.assign(maxValue, true);
    isPrime[1] = false;
    for(int i=2; i*i<=maxValue; i++) {
        if(!isPrime[i]) {
            continue;
        }
        for(int j=i*i; j<=maxValue; j+=i) {
            isPrime[j] = false;
        }
    }
    
    // v[i][j] = i์™€ j๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฐ’์ด ์†Œ์ˆ˜์ธ๊ฐ€
    vector<vector<bool>>v(n+1, vector<bool>(n+1, false));
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            int num = connectedNum(i, j);
            v[i][j] = isPrime[num];
        }
    }
    
    // dp[i][j] = i์™€ j๋ฅผ ์ด์–ด๋ถ™์ธ ๊ฐ’์ด ๋˜๊ธฐ๊นŒ์ง€ ๋‚˜์˜จ ์†Œ์ˆ˜์˜ ๊ฐฏ์ˆ˜
    vector<vector<int>>dp(n+1, vector<int>(n+1, 0));
    dp[1][1] = 0;
    for(int i=2; i<=n; i++) { // dp ์ดˆ๊ธฐํ™”
        dp[1][i] = dp[1][i-1] + v[1][i];
        dp[i][1] = dp[i-1][1] + v[i][1];
    }
    for(int i=2; i<=n; i++) { // dp
        for(int j=2; j<=n; j++) {
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + v[i][j];
        }
    }
    
    // ์ถœ๋ ฅ
    cout << dp[n][n];
    
    return 0;
}
๋ฐ˜์‘ํ˜•