본문 바로가기
백준브실골/DP

백준 10109, Troyangles

by oculis 2023. 3. 28.

개요

문제 링크
골드4, DP
모든 삼각형 모양의 개수 구하기


접근

  1. 골드 DP문제 부터 차근차근 연습해보자. 이게 문제가 현재 위치와 왼, 위, 오른쪽의 개수를 비교하는 문제인 건 바로 알겠는데, 문제는 오른쪽이 업데이트 되기 전에 현재 위치를 오른쪽과 비교해버리니 오류가 난다.
  2. 그러자고 O(N^3)을 돌리자니 시간초과가 난다. 이럴때는 왼쪽 덩이와 오른쪽 덩이를 따로 만들어 둘의 최솟값을 구해주면 된다.
  3. 왼쪽 덩이는? 왼쪽과 위쪽을 비교하고, 오른쪽 덩이는 오른쪽과 위쪽을 비교한다. 나머지는 -1인덱스 방지하기 위해 입력을 잘 해주면 크게 어렵지 않다.

Pseudo code

for (i=세로)
    for (j=가로)
        // 왼쪽 덩이 크기
        Left = min(Left[왼],Left[위])+1
    for (j=가로,오른쪽부터)
        // 오른쪽 덩이 크기
        Right = min(Right[오],Right[위])+1
    for (j=가로)
        dp[i][j]=min(Left,Right)

Source code

#include <iostream>
using namespace std;

#define N 2010

char a[N][N];
int L[N][N],R[N][N];
int main() {
    int n;
    cin>>n;
    int ans=0;
    for (int i=1;i<=n;i++) {
        scanf("%s",&a[i][1]);
        for (int j=1;j<=n;j++) {
            if (a[i][j]!='#') continue;
            L[i][j]=min(L[i-1][j],L[i][j-1])+1;
        }
        for (int j=n;j;j--) {
            if (a[i][j]!='#') continue;
            R[i][j]=min(R[i-1][j],R[i][j+1])+1;
            ans+=min(L[i][j],R[i][j]);
        }
    }
    cout<<ans;
}

'백준브실골 > DP' 카테고리의 다른 글

백준 16132, 그룹 나누기 (Subset)  (0) 2023.04.05
백준 21757, 나누기  (0) 2023.03.30
백준 26156, 나락도 락이다  (0) 2023.03.29
백준 24466, 도피  (0) 2023.03.28
백준 10978, 기숙사 재배정  (0) 2023.02.19
백준 13707, 합분해 2  (0) 2023.02.17
백준 5569, 출근 경로  (0) 2023.02.17
백준 22968, 균형  (2) 2023.02.17