728x90
개요
문제 링크
골드 5, DP
제거할 수 있는 유효지점의 최대 개수
접근
- 현재 지점의 제거가능 여부를 새로운 2d array에 저장한다.
- dp에는 현재 지점을 포함한 최대 제거 가능 지점 수를 저장한다. 만약 '#'이면 0을 저장한다.
- 현재 지점을 제거하려면 앞반대쪽, 반대쪽, 뒤반대쪽에 #이 없어야 한다.
즉, 2 X 2의 4개 점에서 가로 두 개만 제거할 수 있다. 대각선으로 제거해버리면 지나갈 수 없다.// 가운데 아래를 제거할 수 없는 케이스 XOO OXO OOX OOO OOO OOO // 가운데 아래를 제거할 수 있는 케이스 OOO OOO XOO OOX
- 만약 2 X 2의 4개 점에서 모든 4개 점이 제거 가능해도 앞반대쪽이 제거 가능하다면 현재점을 제거할 수 없다.
// 이런 식으로 길이 막혀버린다. OO --> AO --> AO OO OO OB
Pseudo code
for (세로)
for (가로)
if (제거가능)
dp[i][j] = max(앞, 앞반대)
if (제거불가능)
continue
if (앞반대=# || 반대=# || 뒤반대=#)
continue
if (앞반대만 제거가능)
continue
제거가능[i][j] = 1
// 제거가능하므로 1추가
dp[i][j]++
Source code
#include <bits/stdc++.h>
using namespace std;
int a[2][60], b[2][60];
int dp[2][60];
int main() {
int m;
cin >> m;
string t;
a[0][0] = 1;
a[1][0] = 1;
for (int i=0; i<2; i++) {
cin >> t;
for (int j=1; j<=m; j++)
a[i][j] = (t[j-1]=='.');
}
a[0][m+1] = 1;
a[1][m+1] = 1;
dp[0][0] = 0;
dp[1][0] = 0;
for (int j=1; j<=m; j++) {
for (int i=0; i<2; i++) {
dp[i][j] = 0;
if (!a[i][j])
continue;
dp[i][j] = max(dp[i][j-1], dp[1-i][j-1]);
if (!a[1-i][j])
continue;
if (!a[1-i][j-1])
continue;
if (!a[1-i][j+1])
continue;
if (b[1-i][j-1] && !b[i][j-1])
continue;
b[i][j] = 1;
dp[i][j]++;
}
}
cout << max(dp[0][m], dp[1][m]);
}
728x90
'백준브실골 > DP' 카테고리의 다른 글
백준 1943, 동전 분배 (0) | 2023.02.08 |
---|---|
백준 2218, 상자 안의 구슬 (0) | 2023.02.08 |
백준 2228, 구간 나누기 (0) | 2023.02.08 |
백준 2332, 전화번호 (0) | 2023.02.08 |
백준 1577, 도로의 개수 (0) | 2023.02.08 |
백준 25633, 도미노 넘어뜨리기 (0) | 2023.02.08 |
백준 21600, 계단 (0) | 2023.02.08 |
백준 25421, 조건에 맞는 정수의 개수 (0) | 2023.02.08 |
댓글