Skip to content

Latest commit

Β 

History

History
84 lines (56 loc) Β· 4.75 KB

Q2579.md

File metadata and controls

84 lines (56 loc) Β· 4.75 KB

Q2597

문제

계단 였λ₯΄κΈ° κ²Œμž„μ€ 계단 μ•„λž˜ μ‹œμž‘μ λΆ€ν„° 계단 κΌ­λŒ€κΈ°μ— μœ„μΉ˜ν•œ λ„μ°©μ κΉŒμ§€ κ°€λŠ” κ²Œμž„μ΄λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같이 각각의 κ³„λ‹¨μ—λŠ” μΌμ •ν•œ μ μˆ˜κ°€ μ“°μ—¬ μžˆλŠ”λ° 계단을 밟으면 κ·Έ 계단에 μ“°μ—¬ μžˆλŠ” 점수λ₯Ό μ–»κ²Œ λœλ‹€.

https://www.acmicpc.net/upload/images/k64or2GOK1vmpEig7Ud.png

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>와 같이 μ‹œμž‘μ μ—μ„œλΆ€ν„° 첫 번째, 두 번째, λ„€ 번째, μ—¬μ„― 번째 계단을 λ°Ÿμ•„ 도착점에 λ„λ‹¬ν•˜λ©΄ 총 μ μˆ˜λŠ” 10 + 20 + 25 + 20 = 75점이 λœλ‹€.

https://www.acmicpc.net/upload/images/f62omMF2kQYD5rDct.png

계단 였λ₯΄λŠ” λ°λŠ” λ‹€μŒκ³Ό 같은 κ·œμΉ™μ΄ μžˆλ‹€.

  1. 계단은 ν•œ λ²ˆμ— ν•œ 계단씩 λ˜λŠ” 두 계단씩 였λ₯Ό 수 μžˆλ‹€. 즉, ν•œ 계단을 λ°ŸμœΌλ©΄μ„œ μ΄μ–΄μ„œ λ‹€μŒ κ³„λ‹¨μ΄λ‚˜, λ‹€μŒ λ‹€μŒ κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€.
  2. μ—°μ†λœ μ„Έ 개의 계단을 λͺ¨λ‘ λ°Ÿμ•„μ„œλŠ” μ•ˆ λœλ‹€. 단, μ‹œμž‘μ μ€ 계단에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.
  3. λ§ˆμ§€λ§‰ 도착 계단은 λ°˜λ“œμ‹œ λ°Ÿμ•„μ•Ό ν•œλ‹€.

λ”°λΌμ„œ 첫 번째 계단을 밟고 이어 두 번째 κ³„λ‹¨μ΄λ‚˜, μ„Έ 번째 κ³„λ‹¨μœΌλ‘œ 였λ₯Ό 수 μžˆλ‹€. ν•˜μ§€λ§Œ, 첫 번째 계단을 밟고 이어 λ„€ 번째 κ³„λ‹¨μœΌλ‘œ μ˜¬λΌκ°€κ±°λ‚˜, 첫 번째, 두 번째, μ„Έ 번째 계단을 μ—°μ†ν•΄μ„œ λͺ¨λ‘ λ°Ÿμ„ μˆ˜λŠ” μ—†λ‹€.

각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ 이 κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯의 첫째 쀄에 κ³„λ‹¨μ˜ κ°œμˆ˜κ°€ 주어진닀.

λ‘˜μ§Έ 쀄뢀터 ν•œ 쀄에 ν•˜λ‚˜μ”© 제일 μ•„λž˜μ— 놓인 계단뢀터 μˆœμ„œλŒ€λ‘œ 각 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜κ°€ 주어진닀. κ³„λ‹¨μ˜ κ°œμˆ˜λŠ” 300μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄κ³ , 계단에 μ“°μ—¬ μžˆλŠ” μ μˆ˜λŠ” 10,000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 계단 였λ₯΄κΈ° κ²Œμž„μ—μ„œ 얻을 수 μžˆλŠ” 총 점수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

μ½”λ“œ

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int arr[100002] = {0};
    for(int i=1;i<=n;i++) cin >> arr[i];
    int dp[100002];
    dp[1] = arr[1];
    dp[2] = arr[1] + arr[2];
    dp[3] = max(arr[1] + arr[3], arr[2] + arr[3]);
    for(int i=4;i<=n;i++) {
        dp[i] = max(dp[i-2] + arr[i], dp[i-3] + arr[i-1] + arr[i]);
    }
    cout << dp[n];
    return 0;
}

ν•΄μ„€

DP λ¬Έμ œμ΄λ‹€. DP λ¬Έμ œλŠ” 이전에 κ΅¬ν•œ 값듀을 ν™œμš©ν•˜μ—¬ ν˜„μž¬μ˜ 값을 κ΅¬ν•΄λ‚˜κ°€λ©° μΌλ°˜ν™”λ₯Ό ν•˜λŠ” 과정이닀.

λ°°μ—΄ dp λŠ” 각 계단 i μ—μ„œμ˜ μ΅œλŒ“κ°’ 을 μ €μž₯ν•˜κ³ , λ°°μ—΄ arrλŠ” 각 κ³„λ‹¨μ˜ 점수λ₯Ό μ €μž₯ν•œλ‹€.

μ˜ˆμ œμ™€ 같이 6개의 계단 각각의 μ μˆ˜κ°€ 10, 20, 15, 25, 10, 20 이라고 κ°€μ •ν•˜μž.

  1. 첫 번째 κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ€ 자λͺ…ν•˜κ²Œ 10이닀. dp[1] = arr[1] = 10;
  2. 두 번째 κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ€ arr[1] + arr[2] 이닀.
  3. μ„Έ 번째 κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ€, 두 번째 계단을 λ°Ÿμ€ κ²½μš°μ™€ 그렇지 μ•Šμ€ 경우둜 λ‚˜λ‰œλ‹€.
  • 두 번째 계단을 λ°Ÿμ€ 경우, 연속 μ„Έ 계단을 λ°ŸλŠ” 것이 μ•ˆλ˜κΈ° λ•Œλ¬Έμ—, arr[2] + arr[3] 이닀.

  • 두 번째 계단을 λ°Ÿμ§€ μ•Šμ€ 경우, 첫 번째 계단을 λ°ŸμœΌλ―€λ‘œ arr[1] + arr[3] 이닀.

    λ”°λΌμ„œ, λ‘˜ 쀑 μ΅œλŒ“κ°’μ„ κ³ λ₯΄λ©΄ λœλ‹€. max(arr[2] + arr[3], arr[1] + arr[3])

  1. λ„€ 번째 계단 λΆ€ν„°λŠ” μΌλ°˜ν™”λœ 점화식을 μ‚¬μš©ν•  수 μžˆλ‹€.
  • ν•΄λ‹Ή 계단을 κΈ°μ€€μœΌλ‘œ, λ°”λ‘œ μ „ 계단(i-1)을 λ°Ÿμ€ κ²½μš°μ—”, μ „μ „ 계단을 λ°Ÿμ„ 수 μ—†λ‹€. (연속 μ„Έ 계단을 λ°Ÿμ§€ λͺ»ν•œλ‹€λŠ” 쑰건)

    • 이 경우, ν•΄λ‹Ή κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ€ 이 μ „ κ³„λ‹¨μ˜ μ μˆ˜μ™€, μ„Έ 번째 μ „μ˜ κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ„ λ”ν•΄μ£Όμ–΄μ•Όν•œλ‹€. dp[i] = arr[i-1] + dp[i-3] + arr[i

    https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrhoeB%2FbtqSZyjQaER%2FWZKuwqIuCqrURpcr3N6Ytk%2Fimg.png

  • ν•΄λ‹Ή 계단을 κΈ°μ€€μœΌλ‘œ, λ°”λ‘œ μ „ 계단(i-1)을 λ°Ÿμ§€ μ•Šμ€ κ²½μš°μ—”, μ „μ „ 계단을 λ°Ÿμ•„μ•Όν•œλ‹€.

    • 이 경우, ν•΄λ‹Ή κ³„λ‹¨μ—μ„œμ˜ μ΅œλŒ“κ°’μ€ i-2μ—μ„œμ˜ μ΅œλŒ“κ°’μ— ν˜„μž¬ κ³„λ‹¨μ˜ 점수λ₯Ό λ”ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

      dp[i] = dp[i-2] + arr[i]

      https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrhoeB%2FbtqSZyjQaER%2FWZKuwqIuCqrURpcr3N6Ytk%2Fimg.png