[λ°±μ€] 2579λ² - κ³λ¨ μ€λ₯΄κΈ° (C++)
2579λ²: κ³λ¨ μ€λ₯΄κΈ°
κ³λ¨ μ€λ₯΄κΈ° κ²μμ κ³λ¨ μλ μμμ λΆν° κ³λ¨ κΌλκΈ°μ μμΉν λμ°©μ κΉμ§ κ°λ κ²μμ΄λ€. <κ·Έλ¦Ό 1>κ³Ό κ°μ΄ κ°κ°μ κ³λ¨μλ μΌμ ν μ μκ° μ°μ¬ μλλ° κ³λ¨μ λ°μΌλ©΄ κ·Έ κ³λ¨μ μ°μ¬ μλ μ
www.acmicpc.net
λ¬Έμ
κ³λ¨ μ€λ₯΄κΈ° κ²μμ κ³λ¨ μλ μμμ λΆν° κ³λ¨ κΌλκΈ°μ μμΉν λμ°©μ κΉμ§ κ°λ κ²μμ΄λ€. <κ·Έλ¦Ό 1>κ³Ό κ°μ΄ κ°κ°μ κ³λ¨μλ μΌμ ν μ μκ° μ°μ¬ μλλ° κ³λ¨μ λ°μΌλ©΄ κ·Έ κ³λ¨μ μ°μ¬ μλ μ μλ₯Ό μ»κ² λλ€.

μλ₯Ό λ€μ΄ <κ·Έλ¦Ό 2>μ κ°μ΄ μμμ μμλΆν° 첫 λ²μ§Έ, λ λ²μ§Έ, λ€ λ²μ§Έ, μ¬μ― λ²μ§Έ κ³λ¨μ λ°μ λμ°©μ μ λλ¬νλ©΄ μ΄ μ μλ 10 + 20 + 25 + 20 = 75μ μ΄ λλ€.

κ³λ¨ μ€λ₯΄λ λ°λ λ€μκ³Ό κ°μ κ·μΉμ΄ μλ€.
- κ³λ¨μ ν λ²μ ν κ³λ¨μ© λλ λ κ³λ¨μ© μ€λ₯Ό μ μλ€. μ¦, ν κ³λ¨μ λ°μΌλ©΄μ μ΄μ΄μ λ€μ κ³λ¨μ΄λ, λ€μ λ€μ κ³λ¨μΌλ‘ μ€λ₯Ό μ μλ€.
- μ°μλ μΈ κ°μ κ³λ¨μ λͺ¨λ λ°μμλ μ λλ€. λ¨, μμμ μ κ³λ¨μ ν¬ν¨λμ§ μλλ€.
- λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌ νλ€.
λ°λΌμ 첫 λ²μ§Έ κ³λ¨μ λ°κ³ μ΄μ΄ λ λ²μ§Έ κ³λ¨μ΄λ, μΈ λ²μ§Έ κ³λ¨μΌλ‘ μ€λ₯Ό μ μλ€. νμ§λ§, 첫 λ²μ§Έ κ³λ¨μ λ°κ³ μ΄μ΄ λ€ λ²μ§Έ κ³λ¨μΌλ‘ μ¬λΌκ°κ±°λ, 첫 λ²μ§Έ, λ λ²μ§Έ, μΈ λ²μ§Έ κ³λ¨μ μ°μν΄μ λͺ¨λ λ°μ μλ μλ€.
κ° κ³λ¨μ μ°μ¬ μλ μ μκ° μ£Όμ΄μ§ λ μ΄ κ²μμμ μ»μ μ μλ μ΄ μ μμ μ΅λκ°μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
μ λ ₯μ 첫째 μ€μ κ³λ¨μ κ°μκ° μ£Όμ΄μ§λ€.
λμ§Έ μ€λΆν° ν μ€μ νλμ© μ μΌ μλμ λμΈ κ³λ¨λΆν° μμλλ‘ κ° κ³λ¨μ μ°μ¬ μλ μ μκ° μ£Όμ΄μ§λ€. κ³λ¨μ κ°μλ 300μ΄νμ μμ°μμ΄κ³ , κ³λ¨μ μ°μ¬ μλ μ μλ 10,000μ΄νμ μμ°μμ΄λ€.
μΆλ ₯
첫째 μ€μ κ³λ¨ μ€λ₯΄κΈ° κ²μμμ μ»μ μ μλ μ΄ μ μμ μ΅λκ°μ μΆλ ₯νλ€.
νμ΄κ³Όμ
λ¬Έμ μμ μꡬνλ μ¬νμ μλμ κ°λ€.
- κ³λ¨μ νλ²μ 1κ° νΉμ 2κ°
- μ°μμΌλ‘ μΈκ°μ κ³λ¨μ λΆκ°λ₯
- λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌνλ€
μμ κ°μ μ‘°κ±΄λ€ 3κ°μ§λ₯Ό μ§ν€κ³ λ§μ§λ§ κ³λ¨μμ μ»μ μ μλ μ μμ μ΅λκ°μ μΆλ ₯νλ©΄ λλ νμμ λ¬Έμ μμλ€.
ν΄λΉ λ¬Έμ μ νμ΄λ₯Ό μ§ννλ©΄μ μ΄λ»κ² μ κ·Όμ ν΄μΌν κΉ κ³ λ―Όμ νλ€κ° λ¬Έλ μλ¬Έμ μ΄ λ€μλ€.
dpλ ν¬κ² 2κ°μ§ λ°©λ²μΌλ‘ λ¬Έμ λ₯Ό ν μ μλ€κ³ μκ°νλ€.
- κ³Όκ±°μ κ°μΌλ‘ νμ¬μ κ°μ ꡬμ±νλ λ°©μ.
"dp[i] = dp[i - 2] + list[i]" μ²λΌ iμ κ°μ ꡬνκΈ° μν΄μ μ΄μ μ κ°λ€μ κ°μ Έμ€λ λ°©μ. - νμ¬μ κ°μΌλ‘ λ―Έλλ₯Ό ꡬμ±νλ λ°©μ.
"dp[i + 2] = dp[i] + list[i + 2]" μ²λΌ i + 2μ κ°μ ꡬνκΈ°μν΄ νμ¬μ κ°μΌλ‘ λ―Έλμ κ°μ μ§μ ν΄μ£Όλ λ°©μ.
μμ κ°μ λ°©μμΌλ‘ μ κ·Όν μ μλ€κ³ μκ°μ νλλ° 1λ²μ λ°©λ²μ΄λ 2λ²μ λ°©λ²μ΄λ λͺ¨λ μ½λκ° μ§νμ΄ λλ€λ³΄λ©΄
κ°μ κ²°κ³Όκ°μ λμΆν΄ λ΄κΈ°λλ¬Έμ λκ°μ§ λ°©λ² λͺ¨λλ₯Ό μ¬μ©ν΄μ ν μ μμ§μμκΉ? λΌλ μκ°μ΄ λ¬Έλ λ€μλ€.
κ·Έλμ 2λ²μ λ°©λ²μ μ¬μ©ν΄μ λ¬Έμ μ μ κ·Όμ ν΄λ³΄μλ€.
#include <iostream>
#include <algorithm>
// κ³λ¨μ νλ²μ 1κ° νΉμ 2κ°
// μ°μμΌλ‘ μΈκ°μ κ³λ¨μ λΆκ°λ₯
// λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌνλ€.
int main(void)
{
int n;
int dp[303] = {0}, stairs[303] = {0}, counts[303] = {0};
std::cin >> n;
for (int i = 1; i <= n; i++)
std::cin >> stairs[i];
for (int i = 0; i <= n; i++) {
if (dp[i] == 0) dp[i] = stairs[i];
if (i + 2 < n + 1) {
dp[i + 2] = dp[i] + stairs[i + 2];
counts[i + 2] = 1;
}
if (i + 1 < n + 1 && counts[i] + 1 < 3) {
if (i + counts[i] + 1 < n || i + 1 == n) {
if (dp[i + 1] < dp[i] + stairs[i + 1]) {
dp[i + 1] = dp[i] + stairs[i + 1];
counts[i + 1] = counts[i] + 1;
}
}
}
}
std::cout << dp[n];
return (0);
}
κ·Έκ²μ νμ΄λ₯Ό μ§ννλ μ½λκ° μμ κ°λ€.
countsλΌλ λ°°μ΄λ‘ λͺλ²μ°μμΌλ‘ νμΉΈμΌλ‘ μλμ§ νμΈνκ³ , 3λ² μ°μμΌλ‘ νμΉΈμ κ° κ²½μ°λ₯Ό 미리 λ°©μ§ν΄λ²λ¦°λ€.
μμ μ½λλ₯Ό λ°νμΌλ‘ μμ λ₯Ό μ§νν κ²½μ°μλ μ³μ μΆλ ₯κ°μ΄ λμ€λκ²μ νμΈν μ μμλλ° μ μ μ μΆμ ν΄λ³΄λ
λΌλ κ°μ΄ λμ€λ κ²μ νμΈ ν μ μμλ€. κ·Έλμ 무μμ΄ λ¬Έμ μΈκ°λ₯Ό μ°Ύμ보λ μλμ κ°μ λ°λ‘λ₯Ό μ°Ύμ μ μμλ€.
3
40
50
60
answer = 110
μμ μμ μ κ²½μ°μλ 2λ²μ§Έ κ³λ¨μ κ°κ³ 1μΉΈμ λ°μ΄ 3λ²μ§Έ κ³λ¨μ λλ¬ν΄μ 110μ΄λΌλ κ²°κ³Όκ°μ λ΄μΌλ§νμ§λ§
μμ κ°μ μ½λμ κ²½μ°μλ κ°μ λμλ₯Ό λΉκ΅ν΄μ countsμ κ°κ³Ό μκ΄μμ΄ ν°κ°μ΄ μ°μ μ μΌλ‘ μ νκΈ°λλ¬Έμ
μ΅μ’
μ μΌλ‘ 110μ΄λΌλ κ²°κ³Όκ°μ λλ¬ν μ μμλ€.
( 3λ² μ‘°κ±΄μ λ°νμΌλ‘ μ¬μ μ 미리 μ μ§λ₯Ό ν΄λ λ€λ₯Έ μμ μμ νλ €λ²λ¦¬λ μΌμ΄ μκ²Όμλ€. )
μμμ νλ¦° λ΄μ©μΌλ‘ μκ°μ ν΄λ³΄λ 1λ² νμ΄ λ°©μ (κ³Όκ±°μ κ°μΌλ‘ νμ¬μ κ°μ ꡬμ±νλ λ°©μ.) μΌλ‘ μ§νμ νμΌλ©΄ κ³Όκ±°μ κ°μ κΈ°μ€μΌλ‘ νμ¬μ κ°μ ꡬμ±νλ€λ³΄λ μ‘°κΈ λ λ°λ‘λ₯Ό μ κ²½ μμ°κ³ μ½λ νμ΄κ° κ°λ₯ν κ±° κ°μλ°
2λ² νμ΄ λ°©μ (νμ¬μ κ°μΌλ‘ λ―Έλλ₯Ό ꡬμ±νλ λ°©μ.)μ μ¬μ©νλ€λ³΄λ μ κ²½μ¨μΌνλ λ°λ‘κ° λ무 λ§μμ‘μλ€.
κ·Έλμ κ²°λ‘ μ μΌλ‘λ κ³λ¨μ€λ₯΄κΈ° κ°μ΄ "μ°μμΌλ‘ μΈκ°μ κ³λ¨μ λΆκ°λ₯" μμ μ‘°κ±΄μ΄ κ±Έλ €μλ dp λ¬Έμ μ κ²½μ°μλ
1λ² νμ΄ λ°©μμ μ¬μ©νλ κ²μ΄ ν¨μ¬ μ½λκ° κ°λ¨νκ³ νΈν΄μ§λ€λ μ¬μ€μ νμΈ ν μ μμλ€.
1λ² νμ΄ λ°©μμ ν΄μμ λ€μκ³Ό κ°λ€.
λͺ¨λ λ§μ§λ§ κ³λ¨κΉμ§ λλ¬νλ λ°©λ²μ
- κ³λ¨μ νλ²μ 1κ° νΉμ 2κ°
- μ°μμΌλ‘ μΈκ°μ κ³λ¨μ λΆκ°λ₯
- λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌνλ€
μ΄λΌλ 쑰건μΌλ‘ μΈν΄ nλ²κΉμ§ κ³λ¨μ λλ¬νλ λ°©λ²μ
2κ°μ§ λ°©λ²μΌλ‘λ§ λλ¬μ΄ κ°λ₯νλ€. κ·Έ μ΄μΈμ λ°©λ²λ€μ κ·μΉμ μ΄κΈλλ λμ°© λ°©λ²μ΄λ―λ‘ κ°λ₯νμ§μλ€.
κ·Έλμ μμ λ°©λ²μ μ νμμΌλ‘ μ 리λ₯Ό ν΄λ³΄μλ©΄
1λ²μ§Έ
dp[n] = stairs[i] + stairs[i - 1] + dp[i - 3]
2λ²μ§Έ
dp[n] = stairs[i] + dp[i - 2]
μ΄λ κ² 2κ°λ‘ λλμ΄μ§κ² λλ€. κ·Έλμ μμ 쑰건λ€μ λ°νμΌλ‘ λλ¬νλ λ°©λ²μμ²΄κ° μ ν΄μ ΈμμΌλ κ³λ¨μ λͺλ²λ°μκ°λ©΄μ μλμ§λ₯Ό
μκ°νμ§μκ³ λ¬Έμ νμ΄κ° κ°λ₯ν΄μ§κ²λλ€.
code
#include <iostream>
#include <algorithm>
// κ³λ¨μ νλ²μ 1κ° νΉμ 2κ°
// μ°μμΌλ‘ μΈκ°μ κ³λ¨μ λΆκ°λ₯
// λ§μ§λ§ λμ°© κ³λ¨μ λ°λμ λ°μμΌνλ€.
int main(void)
{
int n;
int dp[303] = {0}, stairs[303] = {0};
std::cin >> n;
for (int i = 1; i <= n; i++)
std::cin >> stairs[i];
dp[1] = stairs[1];
dp[2] = stairs[1] + stairs[2];
dp[3] = std::max(stairs[1] + stairs[3], stairs[2] + stairs[3]);
for (int i = 3; i <= n; i++) {
dp[i] = std::max(stairs[i] + dp[i - 2], stairs[i] + stairs[i-1] + dp[i-3]);
}
for (int i = 1; i <= n; i++) {
std::cout << dp[i] << " ";
}
std::cout << dp[n];
return (0);
}
νκΈ°
dp λ¬Έμ λ₯Ό λ³΄κ³ μ΄λ»κ² μ κ·Όμ ν΄μΌν μ§ νμ€νκ² μκ² λλ λ¬Έμ μλ κ±° κ°λ€.
λλΆμ λ§μ΄ λ°°μ°κ³ μ±μ₯νλ€.