일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 백준
- 엘라스틱서치
- 이젠 골드구현도 어렵네..
- DFS
- 다익스트라
- 취득후기
- 완전탐색
- QUICKSTARTGUIDE
- 시뮬레이션
- 구현
- 네트워크플로우
- spring
- deque
- 자바PS
- BFS
- 재귀함수
- 01BFS
- 백준코딩테스트
- GatherTown
- dp
- 게더타운시작
- COSPRO
- 세그먼트트리
- 알고리즘
- PS
- COSPROJAVA1급
- YBMCOS
- 우선순위큐
- 다이나믹프로그래밍
- java
- Today
- Total
공부공간
BOJ - 1890 ) 점프 본문
https://www.acmicpc.net/problem/1890
1890번: 점프
문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로
www.acmicpc.net
DP는 너무나도 어려운것 같다.
점프는 맵에 표시된 수만큼 오른쪽과 아래로 점프한다.
최종 목적지까지 가는 경로를 찾아주면된다.
중간에 한 지점을 생각해서 그 지점에 올수있는 경우의 수가 DP값에 저장된다.
처음 시작지점에 DP 값을 1로 설정하여 움직일수있는 지점에다가 현재의 DP값을 저장해준다.
그렇게 누적되어가는 값이 그 지점으로 올수있는 경우의 수를 뜻한다.
즉 그게 마지막 지점이면 처음에서 시작해서 마지막에 올수있는 모든 경우의 수이다.
처음에는 BFS로 QUEUE에 좌표를 넣고 진행하려했었지만 시간초과가 날것 같았다.
또한 문제에서 경우의수는 2^63-1이라고 지정해준것을 못봐서 70%에서 계속 틀렸다고 나왔다.
경우의수를 저장해주는 DP배열을 long형으로 바꾸어 주어야했다ㅠ
또한 디버깅하다가 맨 마지막 지점에 도착했을때 좌표가 0 0 이므로 자기 자신의 값을 한번더 더하는 예외가 발생하여
처리해주었다. DP너무어렵다 ㅠㅠ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N =Integer.parseInt(st.nextToken())+1;
int map[][] = new int[N][N];
long dp[][] = new long[N][N];
dp[1][1] =1;
for(int y = 1 ; y < N ; y++) {
st = new StringTokenizer(br.readLine());
for( int x = 1 ; x < N ; x++) {
map[y][x] = Integer.parseInt(st.nextToken());
}
}
for(int y = 1 ; y < N ; y++) {
for(int x = 1 ; x < N ; x++) {
if(dp[y][x]==0 || (x==N-1 && y == N-1)) continue;
if(y+map[y][x] <N)dp[y+map[y][x]][x]+=dp[y][x];
if(x+map[y][x] <N)dp[y][x+map[y][x]]+=dp[y][x];
}
}
System.out.println(dp[N-1][N-1]);
}
}
|
cs |
index는 정수값..
패키지는빼주고 클래스이름은 Main으로..
'알고리즘 > Dynamic Programming' 카테고리의 다른 글
BOJ - 11066 ) 파일 합치기 (0) | 2020.02.11 |
---|---|
BOJ - 1965) 상자 넣기 (0) | 2020.02.06 |
BOJ - 11048 ) 이동하기 (0) | 2020.01.30 |
BOJ - 2294 ) 동전 2 (0) | 2020.01.30 |
BOJ - 2293) 동전 1 (0) | 2020.01.30 |