๐ ๋ฌธ์ ํ์ด ๊ณผ์
- ์ฃผ์ด์ง ์์ ์์ ์นด๋ 1์ฅ, 2์ฅ, ... , N์ฅ์ ์ ํํ ๋ ๊ฐ์ง ์ ์๋ ๊ฐ์ฅ ํฐ ๊ธ์ก์ ๊ตฌํด์ ์ผ๋ฐํ๋ ์์ ๋ง๋ค์๋ค.
- DP[i]: ์นด๋๊ฐ i์ฅ์ผ ๋, ์ง๋ถํ ์ ์๋ ๊ฐ์ฅ ํฐ ๊ธ์ก
- N = 4, P = {1, 5, 6, 7} ์ด๋ผ๊ณ ํ์.
- DP[1]์ ์นด๋ 1์ฅ์ ์ ํํ์ ๋ ์ง๋ถ ๊ฐ๋ฅํ ๊ฐ์ฅ ํฐ ๊ธ์ก์ผ๋ก, 1์ฅ์ผ ๋ ๊ธ์ก 1์์ด ์ต๋ ๊ธ์ก์ด๋ค. DP[1] = 1
- DP[2]๋ ์นด๋ 2์ฅ์ ์ ํํ์ ๋ ๊ฐ์ฅ ํฐ ์ง๋ถ ๊ธ์ก์ผ๋ก, 1์ฅ*2, ๋๋ 2์ฅ์ง๋ฆฌ๋ฅผ ์ด ์ ์๋ค. 2์ 5 ๋ ์ค์์ 5๊ฐ ๋ ํฌ๋ฏ๋ก DP[2] = 5 (DP[i]๋ฅผ ๊ฐ์ ธ๊ฐ)
- DP[3]์ 3์ฅ ์ง๋ฆฌ ์ ํ(6), ๋๋ 2์ฅ์ง๋ฆฌ + 1์ฅ์ง๋ฆฌ(6), 1์ฅ์ง๋ฆฌ์ 2์ฅ์ง๋ฆฌ(6) ์ค์ด๋ฏ๋ก DP[3] =6
- DP[4]์ ๊ฒฝ์ฐ, DP[4-1]+A[1] (3์ฅ์ง๋ฆฌ+1์ฅ=7), DP[4-2]+A[2](2์ฅ์ง๋ฆฌ+2์ฅ์ง๋ฆฌ=10), DP[4-3]+A[3](1์ฅ์ง๋ฆฌ+3์ฅ์ง๋ฆฌ=7), DP[4-4]+A[4](4์ฅ์ง๋ฆฌ 1๊ฐ=7) ์ค์์ ์ด๋ฏ๋ก DP[4] = 10์ด๋ค.
- N = 4์ผ ๋, ์ง๋ถํ ์ ์๋ ๊ฐ์ฅ ํฐ ๊ธ์ก์ ๊ตฌํ๋ ๊ฒ์ด๋ฏ๋ก, DP[4]์ธ 10์ด ๋ต์ด ๋๋ค.
DP[i] = max(DP[i], DP[i-j]+A[j])
๋ฐ๋ผ์ ์ ํ์์ ์์ ๊ฐ์ด ๋๋ฉฐ, ์ด๊ธฐ์ ๋ชจ๋ DP[i]=0์ด๊ณ , j์ ๋ํ ๋ฐ๋ณต๋ฌธ์ด ๋๋ฉด์ DP[i]๋ฅผ ๊ฐ์ง๊ฒ ๋๋๋ฐ, ๊ธฐ์ค์ DP[i]์ j์ผ ๋ ๊ตฌํ๋ DP[i-j]+A[j] ์ค์์ ๋ ํฐ ๊ฐ์ DP[i]๋ก ๊ฐ์ ธ๊ฐ๋ค.
๐ป C++ ์ ์ถ์ฝ๋
#include <stdio.h>
#include <deque>
#include <algorithm>
using namespace std;
int main(){
int N;
scanf("%d", &N);
deque<int> P(N+1,0);
deque<int> DP(N+1,0);
for(int i=1; i<=N; i++) scanf("%d", &P[i]);
for(int i=1; i<=N; i++){
for(int j=1; j<=i; j++){
DP[i] = max(DP[i], DP[i-j]+P[j]); //์ด๊ธฐ DP[i]=0
}
}
printf("%d", DP[N]);
}
๐ ๊ฒฐ๊ณผ