π Coding Test Study/Algorithm Problem
[C++][BAEKJOON][DP] 2156λ² ν¬λμ£Ό μμ
ibelieveinme
2021. 8. 5. 23:17
728x90
[λ¬Έμ ]
2156λ²: ν¬λμ£Ό μμ
ν¨μ£Όλ ν¬λμ£Ό μμνμ κ°λ€. κ·Έ κ³³μ κ°λλ, ν μ΄λΈ μμ λ€μν ν¬λμ£Όκ° λ€μ΄μλ ν¬λμ£Ό μμ΄ μΌλ ¬λ‘ λμ¬ μμλ€. ν¨μ£Όλ ν¬λμ£Ό μμμ νλ €κ³ νλλ°, μ¬κΈ°μλ λ€μκ³Ό κ°μ λ κ°μ§ κ·
www.acmicpc.net
[μ€λͺ ]
β μ΄ λ¬Έμ κ° DP μΈ μ΄μ : νμ¬ κ°μ ꡬν λ μ΄μ κ²°κ³Όκ°μ μ΄μ©ν μ μλ λͺ¨μμ΄ λμ€κΈ° λλ¬Έ
- ν¬λμ£Όκ° 1μ μΌ λ,
1μ λͺ¨λλ₯Ό μ νν΄μΌ μ΅λμ΄λ€.
- ν¬λμ£Όκ° 2μ μΌ λ,
2μ λͺ¨λλ₯Ό μ νν΄μΌ μ΅λμ΄λ€.
- ν¬λμ£Όκ° 3μ μΌ λ,
3λ²μ§Έ μμ μ νν κ²½μ°μ μ ννμ§ μμ κ²½μ°λ‘ λλ μ μλ€.
μ΄ λ, 3λ²μ§Έ μμ μ ννμ§ μμ κ²½μ°λ ν¬λμ£Όκ° 2μ μ΄μμ λ ꡬν μ΅λκ°κ³Ό κ°λ€.
3λ²μ§Έ μμ μ ννλ€λ©΄, 2λ²μ§Έ μμ μ ννκ³ 1λ²μ§Έ μμ μ ννμ§ μλ κ²½μ°μ β‘ β β , 2λ²μ§Έ μμ μ ννμ§ μκ³ 1λ²μ§Έ μμ μ ννλ κ²½μ° 2κ°μ§κ° μλ€. β β‘ β
- ν¬λμ£Όκ° 4μ μΌ λ,
4λ²μ¨° μμ μ νν κ²½μ°μ μ ννμ§ μμ κ²½μ°λ‘ λλ μ μλ€.
4λ²μ§Έ μμ μ ννμ§ μλ κ²½μ°λ ν¬λμ£Όκ° 3μ μ΄μμ λ ꡬν μ΅λκ°κ³Ό κ°λ€.
4λ²μ§Έ μμ μ ννλ κ²½μ°λ 3λ²μ§Έ μμ μ ννκ³ 1λ²μ§Έ μμ μ ννλ κ²½μ°μ(=ν¬λμ£Όκ° 1μ μ΄μμ λ ꡬν μ΅λκ°) β β‘ β β , 3λ²μ§Έ μμ μ ννμ§ μκ³ ν¬λμ£Όκ° 2μ μ΄μμ λ ꡬν μ΅λκ°μ μ΄μ©νλ κ²½μ°κ° μλ€. β β β‘ β
- ν¬λμ£Όκ° 5μ μΌ λ,
5λ²μ¨° μμ μ νν κ²½μ°μ μ ννμ§ μμ κ²½μ°λ‘ λλ μ μλ€.
5λ²μ§Έ μμ μ ννμ§ μλ κ²½μ°λ ν¬λμ£Όκ° 4μ μ΄μμ λ ꡬν μ΅λκ°κ³Ό κ°λ€.
5λ²μ§Έ μμ μ ννλ κ²½μ°λ 4λ²μ§Έ μμ μ ννκ³ 2λ²μ§Έ μμ μ ννλ κ²½μ°μ(=ν¬λμ£Όκ° 2μ μ΄μμ λ ꡬν μ΅λκ°) β‘ β β‘ β β , 4λ²μ§Έ μμ μ ννμ§ μκ³ ν¬λμ£Όκ° 3μ μ΄μμ λ ꡬν μ΅λκ°μ μ΄μ©νλ κ²½μ°κ° μλ€. (β‘ β β β‘ β ), (β β β‘ β‘ β ), (β β‘ β β‘ β )
μ¦, νμ¬ κ°μ ꡬν λ μ΄μ κ²°κ³Όκ°μ μ΄μ©ν μ μλ λͺ¨μμ΄ λμ¨λ€.
κ·Έλ¦¬κ³ μμ κ³Όμ μ μ νμμΌλ‘ λνλ΄λ©΄ λ€μκ³Ό κ°λ€.
- ν¬λμ£Όκ° Nμ μΌ λ,
Nλ²μ¨° μμ μ νν κ²½μ°μ μ ννμ§ μμ κ²½μ°λ‘ λλ μ μλ€.
Nλ²μ§Έ μμ μ ννμ§ μλ κ²½μ°λ ν¬λμ£Όκ° N-1μ μ΄μμ λ ꡬν μ΅λκ°κ³Ό κ°λ€.
Nλ²μ§Έ μμ μ ννλ κ²½μ°λ N-1λ²μ§Έ μμ μ ννκ³ N-3λ²μ§Έ μμ μ ννλ κ²½μ°μ(=ν¬λμ£Όκ° N-3μ μ΄μμ λ ꡬν μ΅λκ°), N-1λ²μ§Έ μμ μ ννμ§ μκ³ ν¬λμ£Όκ° N-2μ μ΄μμ λ ꡬν μ΅λκ°μ νμ©νλ κ²½μ°κ° μλ€.
D[N] = max(D[N-1], A[N] + A[N-1] + D[N-3],A [N] + D[N-2])
[μ½λ]
#include <iostream>
#include <vector>
using namespace std;
void DrinkGrapeJuice(int*, int);
int Max(int, int, int);
int main() {
int num = 0;
int grape_juice[10001] = {0,};
cin >> num;
for (int i = 1; i <= num; i++) {
cin >> grape_juice[i];
}
DrinkGrapeJuice(grape_juice, num);
return 0;
}
void DrinkGrapeJuice(int *grape_juice, int num) {
int dp[10001] = {0,};
dp[1] = grape_juice[1];
if (num >= 2) dp[2] = dp[1] + grape_juice[2];
for (int i = 3; i <= num; i++) {
dp[i] = Max(dp[i - 1], dp[i - 2] + grape_juice[i], dp[i - 3] + grape_juice[i - 1] + grape_juice[i]);
}
cout << dp[num];
}
int Max(int a, int b, int c) {
return a > b ? (a > c ? a : c) : (b > c ? b : c);
}
728x90