Algorithm
Algorithm) 백준 1890 점프 c++
행복하고 싶은 사람
2023. 5. 29. 19:36
dp 문제였습니다.
방향은 무조건 오른쪽 or 아래밖에 없으니까 2중 for문을 돌면서 dp 배열을 채워주면 됩니다.
dp[1][1]은 시작 칸이니 1로 셋팅해주고 시작합니다.
for문을 돌면서 범위 체크 해주시고 dp[i][j]에서 갈 수 있는 칸에 dp[i][j]만큼 더해줍니다.
for문이 끝나고 dp[n][n]을 출력하면 정답!
제가 한가지 실수했던 부분이 있습니다. i와 j의 범위를 1~n으로 했는데 입력이 0~9이기 때문에 dp[i][j]가 자신에게 여러번 더해질 수 있는 것입니다. 그래서 if(arr[i][j]!= 0 && dp[i][j] != 0) 요 조건을 넣어줬습니다!
dp로 접근해야겠다는 생각만 하면 어렵지 않게 풀 수 있는 문제였습니다
#include <iostream>
using namespace std;
int arr[101][101];
long long dp[101][101];
int n;
void input() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j <=n; j++) {
cin>>arr[i][j];
}
}
}
void cal() {
dp[1][1] = 1;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(arr[i][j]!= 0 && dp[i][j] != 0) {
if(j+arr[i][j] <= n) {
dp[i][j+arr[i][j]]+= dp[i][j];
}
if(i+arr[i][j] <= n) {
dp[i+arr[i][j]][j] += dp[i][j];
}
}
}
}
}
void solve() {
input();
cal();
cout<<dp[n][n];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
solve();
}