반응형
✏️ 문제 링크
https://www.acmicpc.net/problem/1890
✏️ 문제 설명 (더보기 클릭 👆🏻)
✏️ 문제 풀이
1. DP를 0으로 초기화 해준다.
2. (0,0)에서 시작하며 DP[0][0]은 1로 초기화해준다.
3. 만약 DP[i][j]가 1이상이라면 해당 칸의 값 만큼 오른쪽과 아래로 이동시킨다. (이동 가능한 경우에)
if(DP[i][j]){
int rx=i; int ry=j+gameBoard[i][j];
int dx=i+gameBoard[i][j]; int dy=j;
if(ry<N) DP[rx][ry]+=DP[i][j];
if(dx<N) DP[dx][dy]+=DP[i][j];
}
4. 그냥 1만 더하는게 아니라 DP[i][j]를 더하는 이유는 해당 경로를 지나가는 경우가 여러가지일 수 있기 때문이다.
✏️ 문제 코드
#include <bits/stdc++.h>
using namespace std;
#define MAX 101
int gameBoard[MAX][MAX];
long DP[MAX][MAX];
int N;
void f(int x, int y){
DP[0][0]=1;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++) {
if(i==N-1 && j==N-1) return ;
if(DP[i][j]){
int rx=i; int ry=j+gameBoard[i][j];
int dx=i+gameBoard[i][j]; int dy=j;
if(ry<N) DP[rx][ry]+=DP[i][j];
if(dx<N) DP[dx][dy]+=DP[i][j];
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>N;
for(int i=0; i<N; i++)
for(int j=0; j<N; j++) {cin>>gameBoard[i][j]; DP[i][j]=0;}
f(0,0);
cout<<DP[N-1][N-1]<<"\n";
return 0;
}
⭐ if feedback and question : comment please⭐
반응형
'Algorithm 💫 > Problem Solving' 카테고리의 다른 글
[백준] 2252번: 줄 세우기 / C++ (0) | 2021.10.03 |
---|---|
[백준] 1005번: ACM craft / C++ (0) | 2021.10.03 |
[프로그래머스] 위클리 챌린지: 2주차_상호평가 (0) | 2021.09.30 |
[백준] 1644번: 소수의 연속합 / C++ (0) | 2021.09.30 |
[백준] 2003번: 수들의 합2 / C++ (0) | 2021.09.30 |
댓글