Study hard

(c++)백준 1890번: 점프 본문

백준/DP

(c++)백준 1890번: 점프

Nimgnoej 2020. 9. 16. 16:59

www.acmicpc.net/problem/1890

 

1890번: 점프

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장 ��

www.acmicpc.net

[풀이]

DP로 풀 수 있는 문제였다.

DP[i][j] : (1,1)에서 (i,j)까지 가는 경로의 수

점화식

if(i+Board[i][j]>N) : DP[i+Board[i][j]][j] = DP[i+Board[i][j]][j] + DP[i][j]

if(j+Board[i][j]>N) : DP[i][j+Board[i][j]] = DP[i][j+Board[i][j]] + DP[i][j]

 

#include <iostream>
#include <cstring>//memset
using namespace std;

int N;
int Board[101][101] = { 0, };
long long DP[101][101] = { 0, };

long long Range(int x, int y) {
	if (x > N || y > N)
		return 0;
	else
		return DP[x][y];
}

void solution() {
	DP[1][1] = 1;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (DP[i][j] == 0 || (i == N && j == N))
				continue;
			if (i + Board[i][j] <= N)
				DP[i + Board[i][j]][j] = DP[i + Board[i][j]][j] + DP[i][j];
			if (j + Board[i][j] <= N)
				DP[i][j + Board[i][j]] = DP[i][j + Board[i][j]] + DP[i][j];
		}
	}
	cout << DP[N][N] << '\n';
}

int main() {
	cin >> N;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			cin >> Board[i][j];
		}
	}
	solution();
	return 0;
}

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

(c++)백준 5557번: 1학년  (0) 2020.09.18
(c++)백준 11049번: 행렬 곱셈 순서  (0) 2020.09.16
(c++)백준 11058번: 크리보드  (0) 2020.09.16
(c++)백준 2294번: 동전 2  (0) 2020.09.16
(c++)백준 2293번: 동전 1  (0) 2020.09.16