티스토리 뷰

728x90
반응형
문제 링크

https://www.acmicpc.net/problem/21923

 

21923번: 곡예 비행

동헌이는 모형 비행기 조종 대회에 참가하였다. 이 대회에서는 격자 모양의 공간에서 모형 비행기를 조종하여 얻는 비행 점수로 순위를 매긴다. 격자의 각 칸에는 점수가 부여되어 있고, 비행

www.acmicpc.net

문제 풀이

DP 문제이다. https://www.acmicpc.net/problem/1932 를 풀고 풀면 더 쉽게 풀 수 있을 것 같다.

1. DP를 통해서 올라가는 방향의 점수를 2차원 배열에 저장한다.

2. DP를 통해서 내려가는 방향의 점수를 2차원 배열에 저장한다.

3. 두 배열을 각 지점마다 더하고 MAX값을 비교해 출력한다.

 

풀고나면 생각보다 간단한 문제인 것 같다.

 

소스 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringTokenizer;

public class P21923 {
	static int N , M;
	static int max;
	static int [][] score;
	static int [][] upMove, dwMove ;
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		st = new StringTokenizer(br.readLine(), " ") ;
		
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		max = -999999999;
		score = new int[N][M];
		upMove = new int[N][M];
		dwMove = new int[N][M];
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine(), " ") ;
			for (int j = 0; j < M; j++) {
				score[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		br.close();
		
		//올라가는 방향
		upMove[N-1][0] = score[N-1][0];
		for (int i = N-1; i >= 0; i--) {
			
			if(i!=N-1) upMove[i][0] = upMove[i+1][0] + score[i][0];
			for (int j = 1; j < M; j++) {
				if(i!=N-1) upMove[i][j] = Math.max(upMove[i+1][j], upMove[i][j-1])+ score[i][j];
				else upMove[i][j] =  upMove[i][j-1] + score[i][j];
			}
		}
		
		//내려가는 방향
		dwMove[N-1][M-1] = score[N-1][M-1];
		for (int i = N-1; i >= 0; i--) {
			if(i!=N-1) dwMove[i][M-1] = dwMove[i+1][M-1] + score[i][M-1];
			for (int j = M-2; j >=0; j--) {
				if(i!=N-1) dwMove[i][j] = Math.max(dwMove[i+1][j], dwMove[i][j+1])+ score[i][j];
				else dwMove[i][j] = dwMove[i][j+1] + score[i][j];
						
			}
		}
		
		//올라가는 점수 + 내려가는점수
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				max = Math.max(dwMove[i][j]+ upMove[i][j] , max);
			}
		}
		
		System.out.println(max);
	}
	
	
	
	

}
728x90
반응형
250x250
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함