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

[BOJ][C++] ๋ฐฑ์ค€ 4883๋ฒˆ: ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„

์„ ๋‹ฌ 2024. 9. 13. 15:59
๋ฐ˜์‘ํ˜•

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

 

๋ฌธ์ œ

์ด ๋ฌธ์ œ๋Š” ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€์žฅ ์œ„์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์—์„œ ๊ฐ€์žฅ ์•„๋ž˜์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค.

์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„๋Š” ์‚ฌ์ดํด์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„๋กœ N ≥ 2 ๊ฐœ์˜ ํ–‰๊ณผ 3์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„๋Š” ๋ณดํ†ต ๊ทธ๋ž˜ํ”„์™€ ๋‹ค๋ฅด๊ฒŒ ๊ฐ„์„ ์ด ์•„๋‹Œ ์ •์ ์— ๋น„์šฉ์ด ์žˆ๋‹ค. ์–ด๋–ค ๊ฒฝ๋กœ์˜ ๋น„์šฉ์€ ๊ทธ ๊ฒฝ๋กœ์—์„œ ์ง€๋‚˜๊ฐ„ ์ •์ ์˜ ๋น„์šฉ์˜ ํ•ฉ์ด๋‹ค.

์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์€ N = 4์ธ ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„์ด๊ณ , ๊ฐ€์žฅ ์œ„์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์—์„œ ๊ฐ€์žฅ ์•„๋ž˜์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์œผ๋กœ ๊ฒฝ๋กœ ์ค‘ ์•„๋ž˜๋กœ๋งŒ ๊ฐ€๋Š” ๊ฒฝ๋กœ์˜ ๋น„์šฉ์€ 7+13+3+6 = 29๊ฐ€ ๋œ๋‹ค. ์‚ผ๊ฐ ๊ทธ๋ž˜ํ”„์˜ ๊ฐ„์„ ์€ ํ•ญ์ƒ ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ทธ๋ž˜ํ”„์˜ ํ–‰์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 100,000) ๋‹ค์Œ N๊ฐœ ์ค„์—๋Š” ๊ทธ๋ž˜ํ”„์˜ i๋ฒˆ์งธ ํ–‰์— ์žˆ๋Š” ์ •์ ์˜ ๋น„์šฉ์ด ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋น„์šฉ์€ ์ •์ˆ˜์ด๋ฉฐ, ๋น„์šฉ์˜ ์ œ๊ณฑ์€ 1,000,000๋ณด๋‹ค ์ž‘๋‹ค.

์ž…๋ ฅ์˜ ๋งˆ์ง€๋ง‰ ์ค„์—๋Š” 0์ด ํ•˜๋‚˜ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ, ๊ฐ€์žฅ ์œ„์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์—์„œ ๊ฐ€์žฅ ์•„๋ž˜์ชฝ ๊ฐ€์šด๋ฐ ์ •์ ์œผ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฒˆํ˜ธ์™€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

k. n

k๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฒˆํ˜ธ, n์€ ์ตœ์†Œ ๋น„์šฉ์ด๋‹ค.

 

ํ’€์ด

dp[i][j] = iํ–‰ j์—ด๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ์†Œ ๋น„์šฉ

 

๋น„์šฉ์ด!! ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค!!! ๋Š” ์ ์„!! ์œ ์˜ํ•˜์ž!!!!! ์•„์•…!!

 

dp์˜ ์ฒซ๋ฒˆ์งธ ์ค„(0ํ–‰, dp[0][n])์˜ ์ดˆ๊นƒ๊ฐ’์„ ์ž˜ ์ •ํ•ด์•ผํ•œ๋‹ค

graph[0][0] ์€ ์ง€๋‚˜๊ฐˆ ์ผ์ด ์—†์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ๊ฐ€์žฅ ํฐ ๊ฑฐ ๋„ฃ์–ด์คฌ๋‹ค

graph[0][2] ๋ฅผ ์ง€๋‚˜๊ฐ€๋ ค๋ฉด ๋ฌด์กฐ๊ฑด graph[0][1]์„ ์ง€๋‚˜๊ฐ€์•ผ ์œ ํšจํ•˜๋ฏ€๋กœ ๋‘ ์ˆ˜์˜ ํ•ฉ์„ ๋„ฃ์–ด๋‘”๋‹ค

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

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int INF = 1000;

int n, ans;

int solution(vector<vector<int>>&graph) {
    vector<vector<int>>dp(n, vector<int>(3));
    dp[0][0] = INF;
    dp[0][1] = graph[0][1];
    dp[0][2] = graph[0][1] + graph[0][2];
    
    for(int i=1; i<n; i++) {
        dp[i][0] = min({dp[i-1][0], dp[i-1][1]}) + graph[i][0];
        dp[i][1] = min({dp[i-1][0], dp[i-1][1], dp[i-1][2], dp[i][0]}) + graph[i][1];
        dp[i][2] = min({dp[i-1][1], dp[i-1][2], dp[i][1]}) + graph[i][2];
    }
    
    return dp[n-1][1];
}

int main() {
	for(int i=1; true; i++) {
	   cin >> n;
	   
	   if(n==0) {
	       break;
	   }
	   
	   // ์ž…๋ ฅ
	   vector<vector<int>>graph(n, vector<int>(3));
	    for(int i=0; i<n; i++) {
	        for(int j=0; j<3; j++) {
	            cin >> graph[i][j];
	        }
	    }
	    
	    // ํ’€์ด
	    ans = solution(graph);
	   
	    // ์ถœ๋ ฅ
	    cout << i << ". " << ans << "\n";
	}
    
    return 0;
}
๋ฐ˜์‘ํ˜•