1 분 소요

1043. Partition Array for Maximum Sum

class Solution {
public:
    int maxSumAfterPartitioning(vector<int>& arr, int k) {
        int len = arr.size(), m = 0;
        vector<int> dp(len + 1, 0);
        for (int i = 1; i <= len; ++i) {
            int max = arr[i - 1], res = dp[i - 1] + arr[i - 1];
            for (int j = 1; j <= k && 0 <= i - j; ++j) {
                if (max < arr[i - j]) {
                    max = arr[i - j];
                }
                if (res < dp[i - j] + max * j) {
                    res = dp[i - j] + max * j;
                }
            }
            dp[i] = res;
        }
        return dp[len];
    }
};

i 위치가 i - 1 까지의 정답인 dp array 를 만든다.
max 의 1..k 곱 중 가장 큰 값을 뽑아 정해진 j 값 직접 값과 더하면 가장 큰 합이 된다.
max = max(arr[i - 1], arr[i - j])
dp[i] = max(dp[i - j] + max * j)

arr.size() == n

Time: O(n * k)

  • dp 테이블 모두 순회하므로 n * 각 iteration 당 k 번의 최대값 구하므로 k

Space: O(n)

  • dp 테이블 n

카테고리:

업데이트:

댓글남기기