πŸ“¦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;
}