코딩

백준 21600: 계단

physics07 2021. 7. 17. 12:30

https://www.acmicpc.net/problem/21600

 

21600번: 계단

자료의 분포를 아래의 그림과 같이 나타낸 그래프를 히스토그램이라고 합니다. 당신은 히스토그램 영역에서 가장 큰 계단을 찾으려고 합니다. 계단은 아래 조건을 만족하는 영역을 말합니다.

www.acmicpc.net

문제는 위와 같습니다.

 

 

풀이

히스토그램에서 가장 왼쪽의 높이부터 차례대로 a[0], a[1], a[2], ...라고 합니다.

dp[i]를 (a[i]가 계단의 가장 오른쪽인 계단의 최대 높이)라고 합시다.

점화식을 구해봅시다.

만일 a[i]가 dp[i-1]+1 이상이라면, a[i]가 높이 dp[i-1]+1인 계단의 가장 오른쪽 사각형이 될 수 있고, 그것이 최대이므로 $dp[i]=dp[i-1]+1$가 됩니다.

만일 a[i]가 dp[i-1] 이하라면, a[i]가 계단의 가장 오른쪽 높이가 되는 것이 최대이므로 $dp[i]=a[i]$가 됩니다.

정리해보면

$$dp[i]=\begin{cases}dp[i-1]+1 &(a[i]>dp[i-1])\\ a[i] & (a[i] \leq dp[i-1])\end{cases}$$

가 나오게 됩니다. (단, $dp[0]=1$)

 

코드

위의 풀이로 짠 코드입니다.

#include <bits/stdc++.h>
using namespace std;
int a[100000], dp[100000];
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m=1;
    cin >> n;
    dp[0]=1;
    for(int i=0; i<n; i++) {
        cin >> a[i];
        if(i) {
            if(a[i]>dp[i-1]) dp[i]=dp[i-1]+1;
            else dp[i]=a[i];
        }
        m=max(m, dp[i]); //최대 계단 구하기
    }
    cout << m;
}

 

감사합니다.