[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];
}
# ์นดํ ๊ณ ๋ฆฌ
- BOJ 36
- Algorithm 12
- CodingTest 11
- Web 9
- Javascript 8
- Vue 7
- React 7
- DBProject 4
- Python 3
- Tech-interview 3
- Express 3
- Next 3
- Github 2
- Django 2
- C 1
- C++ 1
- WebGame 1