[HakerRank] DP Max Array Sum (C++)


DP | Max Array Sum

๐Ÿ™‹โ€โ™€๏ธ ๋ฌธ์ œ


Given an array of integers, find the subset of non-adjacent elements with the maximum sum. Calculate the sum of that subset. It is possible that the maximum sum is 0 the case when all elements are negative.

The following subsets with more than element exist. These exclude the empty subset and single element subsets which are also valid.

๐Ÿ™Œ ์ž…์ถœ๋ ฅ


The first line contains an integer, n. (1 <= n <= 10^5) The second line contains n space-separated integers arr[i]. (-10^4 <= n <= 10^4)

๐Ÿ™‹โ€โ™‚๏ธ ์˜ˆ์ œ ์ž…์ถœ๋ ฅ


5
3 5 -7 8 10
15

๐Ÿš€ ์ฝ”๋“œ


#include <iostream>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

int maxSubsetSum(vector<int> arr) {
    int len = arr.size();
    vector<int> dp(len); // DP table
    
    dp[0]=arr[0];
    dp[1]=max(arr[0], arr[1]); // dp[1] = arr[1] ํ•˜๋ฉด ์•ˆ๋จ!

    for (int i = 2; i < len; i++) {
        dp[i] = max(arr[i], max(arr[i] + dp[i - 2], dp[i - 1]));
    }

    return dp[len-1];
}


int main() {
    int n = 0;
    vector<int> arr;
    int x = 0;
    cin >> n;
	for (int i = 0; i < n; i++) {
        cin >> x;
        arr.push_back(x);
	}
    cout << maxSubsetSum(arr);

	return 0;
}

๐ŸŒ  ๋ฉ”๋ชจ


ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์ฒ˜๋Ÿผ ์ž…์ถœ๋ ฅ์€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  maxSubsetSumํ•จ์ˆ˜ ๋ถ€๋ถ„๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

์˜ค๋žœ๋งŒ์— ๋‹ค์‹œ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ดค๋Š”๋ฐ, ์ฒ˜์Œ ์‹œ๋„ํ–ˆ์„ ๋•Œ ๋งŒํผ basicํ•œ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š”๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง„ ์•Š์•˜๋‹ค.(15๋ถ„์ด ์ฑ„ ์•ˆ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌผ๋ก  ์˜ค๋ฅ˜ ๊ณ ์น˜๊ณ , ์ฐพ์•„๋ณด๊ณ  ํ•˜๋ฉด์„œ ์ด ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์€ 1์‹œ๊ฐ„ ์ •๋„..) ๊ทธ๋Ÿฐ๋ฐ ์ž๊พธ ์˜ˆ์ œ ์ž…์ถœ๋ ฅ๋งŒ ์„ฑ๊ณตํ•˜๊ณ  ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ํ‹€๋ ธ๋‹ค.. ๐Ÿ˜ฅ

์ผ๋‹จ ์ฒ˜์Œ ๋ฌธ์ œ์—์„œ non-adjacent elements์— ์ง‘์ค‘ํ•˜๋Š” ๋ฐ”๋žŒ์— dp ํ…Œ์ด๋ธ”์— ์ €์žฅํ•  ๋•Œ๋„ (arr[i] + dp[i - 2], arr[i] + dp[i - 3])๋ฅผ ๋น„๊ตํ•ด์„œ ์ €์žฅํ–ˆ๋‹ค. (๋‹คํ–‰ํžˆ ๊ธˆ๋ฐฉ ์˜ค๋ฅ˜๋ฅผ ์žก์•˜๋‹ค.)

๐Ÿ“ŒPoint

  • ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„์ด์ง€๋งŒ, vector<int> dp;๋กœ ์„ ์–ธํ–ˆ์„ ๋•Œ๋Š” ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— dp[i]๋ผ๋Š” ์œ„์น˜์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํฌ๊ธฐ ๋น„๊ต๋Š” if๋ฌธ ๋ง๊ณ  algorithmํ—ค๋”์˜ min, max์ด์šฉํ•˜์ž. ์ž์ฃผ ์•ˆ์“ฐ๋‹ค ๋ณด๋‹ˆ ๊นŒ๋จน๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
  • dp[i] ์œ„์น˜ ๊นŒ์ง€์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•  ๋•Œ ์ง€๊ธˆ์ฒ˜๋Ÿผ i๋ฒˆ์งธ ์›์†Œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋”ํ•œ ๊ฐ’์ด ๋” ํด ์ˆ˜ ์žˆ๋‹ค.(์„ค๋ช…์„ ์ž˜ ๋ชปํ•˜๊ฒ ๋Š”๋ฐ, i-1๊นŒ์ง€์˜ ์›์†Œ๊ฐ€ ๋ชจ๋‘ ์Œ์ˆ˜์ด๊ณ  i๋ถ€ํ„ฐ ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ๋Š” arr[i] + dp[i - 2], dp[i - 1]๋ฅผ ์•„๋ฌด๋ฆฌ ํ•ด๋„ arr[i]๋ณด๋‹ค ์ž‘๋‹ค.)max(arr[i], max(arr[i] + dp[i - 2], dp[i - 1]))
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ผ๋ถ€๋งŒ ํ†ต๊ณผํ•  ๊ฒฝ์šฐ ์œ„์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฒฝ์šฐ๋ฅผ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž.
  • dp ํ…Œ์ด๋ธ”์„ ๋’ค์—์„œ๋ถ€ํ„ฐ ๊ตฌ์„ฑํ•˜๋ฉด dp[i - 1], arr[i] + dp[i - 2]๋งŒ ๋น„๊ตํ•ด๋„ ๋œ๋‹ค. ์•„์ง ๋ช…ํ™•ํ•˜๊ฒŒ ๊นจ๋‹ซ์ง€๋Š” ๋ชปํ–ˆ์ง€๋งŒ, ๋’ค์—์„œ ๋ถ€ํ„ฐ ๋”ํ•ด์˜ค๋ฉด ์ด์ „๊นŒ์ง€์˜ ์›์†Œ์˜ ๊ฐ’์ด ์ƒ๊ด€ ์—†๊ธฐ? ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค. (i-1๊นŒ์ง€์˜ ์›์†Œ๊ฐ€ ๋ชจ๋‘ ์Œ์ˆ˜์ด๊ณ  i๋ถ€ํ„ฐ ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ -> ๋ฅผ ์‹ ๊ฒฝ ์•ˆ์จ๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€ ์•Š์„๊นŒ?)
  • ์ฝ”๋“œ์— ์ ์šฉ์€ ์•ˆํ•ด๋ดค๋Š”๋ฐ, ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜๋‹ค. no need for a huge array dp(n) ! it's enough to store "last" and "before" ๋Œ“๊ธ€์˜ ๋‚ด์šฉ์ธ๋ฐ, dp ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๊ฐ€์งˆ ํ•„์š” ์—†๊ณ  dp[i], dp[i-1], dp[i-2]๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ์‹์œผ๋กœ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฐธ๊ณ ๋ฅผ ์œ„ํ•ด ๋’ค์—์„œ ๋ถ€ํ„ฐ dp ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋„ ์ฒจ๋ถ€ํ•œ๋‹ค.

int maxSubsetSum(vector<int> arr) {
    int len = arr.size();
    vector<int> dp(len + 3);

    for (int i = len - 1; i >= 0; i--) {
        dp[i] = max(arr[i] + dp[i + 2], dp[i + 1]);
    }
    return dp[0];
}turn dp[len-1];
}



# ์นดํ…Œ๊ณ ๋ฆฌ