-
10-8: 자원채취DP 2018. 10. 25. 21:49
자원채취
문제
N x M의 지도가 주어지며, 이 지도의 각 칸에는 자원이 존재한다. 자원의 양은 정수로 나타난다. 다음 그림은 5 x 6 의 지도에 존재하는 자원을 나타낸다.
철수는 자원을 채취하는 로봇을 갖고 있으며, 이 로봇은 (0, 0) 에서 출발하여 (N-1, M-1) 에서 자원 채취를 마친다. 로봇은 한가지 제약이 있는데, 오른쪽과 아랫쪽으로밖에 움직일 수 없다는 것이다. 이 로봇을 이용하여 가장 많이 채취할 수 있는 자원의 양을 출력하는 프로그램을 작성하시오. 위의 예제의 경우 다음과 같이 채취하는 것이 최대이며, 그 양은 49이다.
입력
첫 번째 줄에 N, M이 주어진다. ( 1 ≤ N, M ≤ 1,000 ) 두 번째 줄부터 N x M 의 지도에 존재하는 자원의 양이 주어진다.
출력
로봇을 이용하여 채취할 수 있는 자원의 양의 최댓값을 출력한다.
예제 입력
5 6 1 7 3 2 8 0 9 2 3 4 5 4 3 4 7 8 2 2 1 4 3 1 4 1 3 2 5 5 3 8
예제 출력
49
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class dp_res_mining {
/**
* 자원채취
*
* 문제:
* N x M의 지도가 주어지며, 이 지도의 각 칸에는 자원이 존재한다. 자원의 양은 정수로 나타난다. 다음 그림은 5 x 6 의 지도에 존재하는 자원을 나타낸다.
*
* 철수는 자원을 채취하는 로봇을 갖고 있으며, 이 로봇은 (0, 0) 에서 출발하여 (N-1, M-1) 에서 자원 채취를 마친다.
* 로봇은 한가지 제약이 있는데, 오른쪽과 아랫쪽으로밖에 움직일 수 없다는 것이다. 이 로봇을 이용하여 가장 많이 채취할 수 있는 자원의 양을 출력하는 프로그램을 작성하시오. 위의 예제의 경우 다음과 같이 채취하는 것이 최대이며, 그 양은 49이다.
*
* 입력:
* 첫 번째 줄에 N, M이 주어진다. ( 1 ≤ N, M ≤ 1,000 ) 두 번째 줄부터 N x M 의 지도에 존재하는 자원의 양이 주어진다.
*
* 출력:
* 로봇을 이용하여 채취할 수 있는 자원의 양의 최댓값을 출력한다.
*
* 예제 입력:
* 5 6
* 1 7 3 2 8 0
* 9 2 3 4 5 4
* 3 4 7 8 2 2
* 1 4 3 1 4 1
* 3 2 5 5 3 8
*
* 예제 출력:
* 49
*
* @param args
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] arr = new int[N][M];
for (int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
for (int j=0; j<M; j++){
arr[i][j] = Integer.parseInt(st.nextToken());
}
}
int[][] sum = new int[N][M];
sum[0][0] = arr[0][0];
for (int i=1; i<N; i++){
sum[i][0] = arr[i][0] + sum[i-1][0];
}
for (int i=1; i<M; i++){
sum[0][i] = arr[0][i] + sum[0][i-1];
}
for (int i=1; i<N; i++){
for (int j=1; j<M; j++){
sum[i][j] = Math.max(sum[i][j-1]+arr[i][j], sum[i-1][j] + arr[i][j]);
}
}
System.out.println(sum[N-1][M-1]);
}
}'DP' 카테고리의 다른 글
10-10: 두 문자열 사이의 거리 (1) 2018.10.25 10-9: 연속부분 최대합 L (0) 2018.10.25 10-7: 제곱수의 합 (0) 2018.10.25 10-6: 직사각형 배치의 경우의 수 (0) 2018.10.25 10-5: 버튼 누르기 (0) 2018.10.25