블로그 언저리인 무언가
[백준/BOJ] 1577 도로의 개수 본문
728x90
문제 : 1577 도로의 개수
도시의 크기가 주어지고 공사 중인 도로의 크기가 주어졌을 때,
(0,0)에서 (N, M)까지 가는 경우의 수를 출력하는 문제이다.
도로가 정상적일 때 현재 위치기준 왼쪽+아래가 경우의 수 이므로
공사중인 도로인지 아닌지 체크하며 DP 배열을 채우면 된다.
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct ABC{
ll a, b, c, d;
ABC(){}
ABC(ll a, ll b, ll c, ll d) : a(a), b(b), c(c), d(d) {}
};
bool operator<(ABC x, ABC y){
if (x.a<y.a || (x.a==y.a && (x.b<y.b || (x.b==y.b && (x.c<y.c || (x.c==y.c && x.d<y.d))))))
return 1;
else
return 0;
}
ll N, M, K, DP[105][105];
vector<ABC> arr;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M >> K;
while (K--){
ll a, b, c, d;
cin >> a >> b >> c >> d;
if (a>c || (a==c && b>d))
arr.push_back({a,b,c,d});
else
arr.push_back({c,d,a,b});
}
DP[0][0]=1;
sort(arr.begin(),arr.end());
for (int i=0;i<=N;i++){
for (int j=0;j<=M;j++){
if (i-1>=0 && !binary_search(arr.begin(),arr.end(),ABC(i,j,i-1,j)))
DP[i][j]+=DP[i-1][j];
if (j-1>=0 && !binary_search(arr.begin(),arr.end(),ABC(i,j,i,j-1)))
DP[i][j]+=DP[i][j-1];
}
}
cout << DP[N][M];
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[백준/BOJ] 17251 힘 겨루기 (0) | 2020.09.29 |
---|---|
[백준/BOJ] 2879 코딩은 예쁘게 (0) | 2020.09.28 |
[백준/BOJ] 14370 전화번호 수수께끼 (Large) (0) | 2020.09.27 |
[백준/BOJ] 4388 받아올림 (0) | 2020.09.27 |
[백준/BOJ] 9370 미확인 도착지 (0) | 2020.09.26 |
Comments