μ λ ₯
μ λ ₯μ 첫째 μ€μ κ³λ¨μ κ°μκ° μ£Όμ΄μ§λ€.
λμ§Έ μ€λΆν° ν μ€μ νλμ© μ μΌ μλμ λμΈ κ³λ¨λΆν° μμλλ‘ κ° κ³λ¨μ μ°μ¬ μλ μ μκ° μ£Όμ΄μ§λ€. κ³λ¨μ κ°μλ 300μ΄νμ μμ°μμ΄κ³ , κ³λ¨μ μ°μ¬ μλ μ μλ 10,000μ΄νμ μμ°μμ΄λ€.
μΆλ ₯
첫째 μ€μ κ³λ¨ μ€λ₯΄κΈ° κ²μμμ μ»μ μ μλ μ΄ μ μμ μ΅λκ°μ μΆλ ₯νλ€.
ν΄κ²° λ°©λ²
dp λ¬Έμ μ΄λ―λ‘ μ νμμ μ°ΎμμΌνλ€.
λμ°©μ§μ μ κ° μ μλ λ°©λ²μ μ΄λ»κ² λ κΉ? λ κ°μ§λ‘ λλ μ μλ€.
i) μ κ³λ¨μ λ°κ³ λμ°© μ§μ μ λ°λ κ²½μ°
ii) μ μ κ³λ¨μ λ°κ³ λμ°© μ§μ μ λ°λ κ²½μ°
μ΄λ κ² λ κ°μ§λ‘ λλ μ μλλ° μ£Όμν μ μ μ°μλ 3κ°μ κ³λ¨μ λ°μ μ μλ€λ κ²μ΄λ€.
μ¦, i) μμ μ κ³λ¨μ λ°κΈ° μ΄μ μ μ μ κ³λ¨μ λ°μ μ μκ³ , 무쑰건 μ μ μ κ³λ¨μ λ°μμΌνλ€λ κ²μ΄λ€.
λ°λΌμ μ΄ μ‘°κ±΄μ μ νμμΌλ‘ λνλ΄λ©΄
i) μ μ μ κ³λ¨μ μ΅λκ° + μ κ³λ¨ + λμ°© κ³λ¨ = dp[i-3] + stair[i-1] + stair[i]
ii) μ μ κ³λ¨μ μ΅λκ° + λμ°© κ³λ¨ = dp[i-2] + stair[i]
μμ κ°μ΄ λνλΌ μ μλ€.
ν΄κ²° κ³Όμ
μμ μ νμμ λ°λ³΅λ¬Έμ ν΅ν΄ νμνλ©΄ λλ€. μ¬κΈ°μ ν κ°μ§ λ μ£Όμν μ μ΄ μλ€.
μ νμμ μ΄ν΄λ³΄λ©΄ dp[i-3], dp[i-2] μ΄λ―λ‘ λ°λ³΅λ¬Έμ μμ index κ°μ i≥3 μΌλ‘ μ‘μμ€μΌ νλ€λ κ²μ΄λ€.
λ°λΌμ dp[0], dp[1], dp[2]λ₯Ό 미리 μ μΈν΄λμ νμκ° μλ€.
ν΄λΉ κ³λ¨κΉμ§μ μ΅λ κ°μ μ μ₯ν΄λμ λ°°μ΄μ΄ dpλΌκ³ ν λ μλμ κ°μ΄ λνλΌ μ μλ€.
dp[0] = stair[0]
dp[1] = max(stair[1], stair[0] + stair[1])
dp[2] = max(stair[0] + stair[1], stair[1] + stair[2])
μ¬κΈ°μ maxν¨μλ μ΅λ κ°μ returnνλ ν¨μμ΄λ€.
μ΅μ’ μ½λλ
#include <iostream>
using namespace std;
int max(int a, int b){
return a > b ? a : b;
}
int main(){
int n;
int stair[300], dp[300];
cin >> n;
for(int i = 0; i < n; i++){
cin >> stair[i];
}
dp[0] = stair[0];
dp[1] = max(stair[1], stair[0] + stair[1]);
dp[2] = max(stair[0] + stair[2], stair[1] + stair[2]);
for(int i = 3; i < n; i++){
dp[i] = max(dp[i-2] + stair[i], dp[i-3] + stair[i-1] + stair[i]);
}
cout << dp[n-1];
return 0;
}
'βοΈ μ½ν μ€λΉ > Dynamic Programming' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λμ κ³νλ² 1] [C++] 10844λ². μ¬μ΄ κ³λ¨ μ (0) | 2021.01.24 |
---|---|
[λμ κ³νλ² 1] [C++] 1463λ². 1λ‘ λ§λ€κΈ° (0) | 2021.01.19 |
[λμ κ³νλ² 1] [C++] 1932λ². μ μ μΌκ°ν (0) | 2021.01.13 |
[λμ κ³νλ² 1] [C++] 1149λ². RGB 거리 (0) | 2021.01.13 |
[λμ κ³νλ² 1] [C++] 9461λ². νλλ° μμ΄ (0) | 2021.01.13 |