알고리즘/알고리즘 문제풀이

[백준] 11055번 : 가장 큰 증가하는 부분 수열

mint* 2023. 12. 7. 23:58
728x90

url : https://www.acmicpc.net/problem/11055

 

11055번: 가장 큰 증가하는 부분 수열

수열 A가 주어졌을 때, 그 수열의 증가하는 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가하는

www.acmicpc.net

 

초기 작성 코드

#include <bits/stdc++.h>

using namespace std;
int n, tmp, answer;

int main(){
    ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    // 1.입력 받기
    cin >> n;
    vector<int> v(n, 0);
    vector<int> dp(n, 0);
    for (int i=0;i<n;i++){
        cin >> tmp;
        v[i] = tmp;
    } 
    // 2. 가장 큰 원소를 기준으로 합 구하기 
    dp[0] = v[0];
    for(int i=1;i<n;i++){
            int tmpSum=dp[0];
            for (int k=i-1;k>=0;k--){
                if(v[k]<v[i]) {
                    tmpSum = max(tmpSum, dp[k]);
                }
            if (tmpSum==0) dp[i]=v[i];
            else dp[i] = tmpSum + v[i]; 
        }
    }
    //3. 가장 큰 합 구하기
    for(int i=0;i<n;i++){
        answer = max(dp[i], answer);
    }
    //4. 정답 출력
    cout << answer;
}

 

반복을 줄인 리팩토링 코드

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
    int n;
    cin >> n;
    vector<int> v(n);
    for (int i = 0; i < n; i++) {
        cin >> v[i];
    }
    // 수정한 부분
    vector<int> dp(n);
    int answer = dp[0] = v[0]; // 초기값과 최대 합을 설정
    for (int i = 1; i < n; i++) {
        dp[i] = v[i]; // tmpSum이 0인 경우를 기본값으로 설정
        for (int k = i - 1; k >= 0; k--) {
            if (v[k] < v[i]) {
                dp[i] = max(dp[i], dp[k] + v[i]);
            }
        }
        answer = max(dp[i], answer); // 최대 합을 갱신
    }
    
    cout << answer;
    return 0;
}

 

 

풀이

728x90