๐Ÿ“ฆ11066: ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ


[์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด] ๊ฐ•๋™๊ทœ
Reviewed by Kade Kang (devkade12@gmail.com)
Reviewed:: 2024-02-19
๋ฌธ์ œ ํ™•์ธํ•˜๊ธฐ

ํ’€์ด

  • Matrix_calcuation-11049 ๋ฌธ์ œ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๋ฌธ์ œ์ด๋‹ค.
  • ์ด ๋ฌธ์ œ์—์„œ ์ฃผ์˜ํ•  ์ ์€ ์ž„์‹œํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด์„œ ์ค‘๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ์ด๋‹ค.
  • C1, C2, C3, C4 = 40, 30, 30, 50 ์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด์ž.
  • ๋ฌธ์ œ๋Œ€๋กœ ํ•ฉ์ณ ๋ณด๋ฉด
    • C2 + C3 = 60 = X1
    • X1 + C1 = 100 = X2
    • X2 + C4 = 150 = X3
    • ์ตœ์ข… = X1(C2 + C3) + X2(C1 + C2 + C3) + X4(C1 + C2 + C3 + C4)
  • ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•ด์„œ ๋ณ€ํ˜•ํ•ด์ค€๋‹ค.
  • 3์ค‘ for๋ฌธ์€ Matrix_calcuation-11049 ์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.
  • ํ’€์ด

    • ์ด ๋ฌธ์ œ๋Š” 1์‹œ๊ฐ„์„ ๊ณ ๋ฏผํ•ด๋„ ์ „ํ˜€ ๊ฐˆํ”ผ๋ฅผ ์žก์ง€ ๋ชปํ•˜๊ฒ ์–ด์„œ ๊ฒฐ๊ตญ https://cocoon1787.tistory.com/318์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค. ํ™•์‹คํžˆ DP ๋ฌธ์ œ์— ์•ฝํ•˜๋‹ค๊ณ  ๋А๊ปด์ง„๋‹ค.

    • dp[n][m] ๋Š” n ์—์„œ m ๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ํ–‰๋ ฌ ์—ฐ์‚ฐํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

    • 3์ค‘ for ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ–‰๋ ฌ ์—ฐ์‚ฐ์˜ ๋ฒ”์œ„, ์‹œ์ž‘ ์ง€์ , ๋ฒ”์œ„ ์—ฐ์‚ฐ์„ ์ง€์ •ํ•ด ๊ณ„์‚ฐํ•œ๋‹ค.

    • i ๋Š” ํ–‰๋ ฌ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•œ๋‹ค. i = 2 ์ผ ๊ฒฝ์šฐ, dp[n][m] ์—์„œ m-n, n๊ณผ m ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ, ์ฐจ์ด๊ฐ€ 2๋ผ๋Š” ๋œป์ด๋‹ค.

    • j ๋Š” ํ–‰๋ ฌ์˜ ์‹œ์ž‘ ์ง€์ ์„ ๋งํ•œ๋‹ค. j = 3, i = 2 ์ธ ๊ฒฝ์šฐ dp[3][5] ๋กœ 3์—์„œ ์‹œ์ž‘ํ•ด์„œ 5๋ฒˆ์งธ๊นŒ์ง€์˜ ํ–‰๋ ฌ์„ ๊ตฌํ•œ๋‹ค.

    • mid ๋Š” ๋ฒ”์œ„ ์•ˆ์—์„œ์˜ ์‹ค์งˆ์ ์ธ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค. dp[3][10] ์„ ๊ตฌํ•œ๋‹ค๊ณ  ํ•˜๋ฉด mid ๋Š” 3~10 ์˜ ๊ฐ’์ด๊ณ , ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ dp[3][3], dp[3][4], โ€ฆ ๋ฅผ ๊ตฌํ•œ๋‹ค.

    • ์ตœ์ข…์ ์œผ๋กœ๋Š” dp[1][N] ์„ ๊ตฌํ•˜๋ฉด 1~N ๊นŒ์ง€์˜ ํ–‰๋ ฌ ์—ฐ์‚ฐ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ํ˜ผ์ž ์ƒ๊ฐํ•  ๋•Œ dp๋กœ ๋А๋‚Œ์ด ๋“ค๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•˜๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•˜๋Š” ๋ฐฉ์‹์ด ์ดํ•ด๋ฅผ ํ•˜๋‹ˆ๊นŒ ๋„๋•์ผ ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ์ฒด๋“์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

    Link to original
#include <iostream>
 
#define endl '\n'
using namespace std;
 
int T, N;
int Info[501][2];
int dp[501][501];
 
void Input(){
    cin >> N;
    for(int i=1; i<=N; i++) {
        cin >> Info[i][0];
        Info[i][1] = Info[i-1][1] + Info[i][0];
    }
}
 
void Solution(){
    while(T--){
        Input();
        for(int i=1; i<N; i++){
            for(int j=1; i+j<=N; j++){
                dp[j][i+j] = INT32_MAX;
                for(int k=j; k<=i+j; k++){
                    dp[j][i+j] = min(dp[j][i+j], dp[j][k] + dp[k+1][i+j]                                       + Info[i+j][1] - Info[j-1][1]);
                }
            }
        }
        cout << dp[1][N] << endl;
    }
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> T;
    Solution();
 
    return 0;
}