[Algorithm] ๐Ÿค–๋ฐฑ์ค€ 2169 ๋กœ๋ด‡ ์กฐ์ข…ํ•˜๊ธฐ

HaJingJingยท2021๋…„ 4์›” 29์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
26/119

0. ๋ฌธ์ œ

NASA์—์„œ๋Š” ํ™”์„ฑ ํƒ์‚ฌ๋ฅผ ์œ„ํ•ด ํ™”์„ฑ์— ๋ฌด์„  ์กฐ์ข… ๋กœ๋ด‡์„ ๋ณด๋ƒˆ๋‹ค. ์‹ค์ œ ํ™”์„ฑ์˜ ๋ชจ์Šต์€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•˜์ง€๋งŒ, ๋กœ๋ด‡์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ผ๋งˆ ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€ํ˜•์„ Nร—M ๋ฐฐ์—ด๋กœ ๋‹จ์ˆœํ™” ํ•˜์—ฌ ์ƒ๊ฐํ•˜๊ธฐ๋กœ ํ•œ๋‹ค.

์ง€ํ˜•์˜ ๊ณ ์ €์ฐจ์˜ ํŠน์„ฑ์ƒ, ๋กœ๋ด‡์€ ์›€์ง์ผ ๋•Œ ๋ฐฐ์—ด์—์„œ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•„๋ž˜์ชฝ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์œ„์ชฝ์œผ๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ํ•œ ๋ฒˆ ํƒ์‚ฌํ•œ ์ง€์—ญ(๋ฐฐ์—ด์—์„œ ํ•˜๋‚˜์˜ ์นธ)์€ ํƒ์‚ฌํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ์ง€์—ญ์€ ํƒ์‚ฌ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”๋ฐ, ๋กœ๋ด‡์„ ๋ฐฐ์—ด์˜ ์™ผ์ชฝ ์œ„ (1, 1)์—์„œ ์ถœ๋ฐœ์‹œ์ผœ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ (N, M)์œผ๋กœ ๋ณด๋‚ด๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ, ์œ„์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ, ํƒ์‚ฌํ•œ ์ง€์—ญ๋“ค์˜ ๊ฐ€์น˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ์งธ ์ค„์— N, M(1โ‰คN, Mโ‰ค1,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” M๊ฐœ์˜ ์ˆ˜๋กœ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐฐ์—ด์˜ ๊ฐ ์ˆ˜๋Š” ์ ˆ๋Œ“๊ฐ’์ด 100์„ ๋„˜์ง€ ์•Š๋Š” ์ •์ˆ˜์ด๋‹ค. ์ด ๊ฐ’์€ ๊ทธ ์ง€์—ญ์˜ ๊ฐ€์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ์ตœ๋Œ€ ๊ฐ€์น˜์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

1. ์•„์ด๋””์–ด

2๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘ ํƒ์ƒ‰
1) ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ (left)
2) ์˜ค๋ฅธ์ชฝ โ†’ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ (right)
๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’ dp์— ์ €์žฅ

2. ํ•ต์‹ฌ ํ’€์ด

2๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘ ํƒ์ƒ‰
1) ์™ผ์ชฝ โ†’ ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ (left)

left[1] = dp[r-1][1] + map[r][1];
for(int c=2; c<m+1; c++)
		left[c] = Math.max(left[c-1], dp[r-1][c]) + map[r][c];

2) ์˜ค๋ฅธ์ชฝ โ†’ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ (right)

right[m] = dp[r-1][m] + map[r][m];
for(int c=m-1; c>=1; c--)
		right[c] = Math.max(right[c+1], dp[r-1][c]) + map[r][c];

๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’ dp์— ์ €์žฅ

for(int c=1; c<m+1; c++)
				dp[r][c] = Math.max(left[c], right[c]);

3. ์ฝ”๋“œ

import java.io.*;

public class DP_9 {
	static int map[][], dp[][], left[], right[];
	static int n, m;
	public static void main(String args[]) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s[] = br.readLine().split(" ");
		n = Integer.parseInt(s[0]);
		m = Integer.parseInt(s[1]);
		
		map = new int[n+1][m+1];
		dp = new int[n+1][m+1];
		left = new int[m+1];
		right = new int[m+1];
		
		for(int i=1; i<n+1; i++) {
			s = br.readLine().split(" ");
			for(int j=1; j<m+1; j++) {
				map[i][j] = Integer.parseInt(s[j-1]);
			}
		}
		
		for(int i=1; i<m+1; i++)
			dp[1][i] = (dp[1][i-1] + map[1][i]);
		
		System.out.println(control());
	}
	
	static int control() {
		
		for(int r=2; r<n+1; r++) {
			left[1] = dp[r-1][1] + map[r][1];
			for(int c=2; c<m+1; c++)
				left[c] = Math.max(left[c-1], dp[r-1][c]) + map[r][c];
			
			right[m] = dp[r-1][m] + map[r][m];
			for(int c=m-1; c>=1; c--)
				right[c] = Math.max(right[c+1], dp[r-1][c]) + map[r][c];
			
			for(int c=1; c<m+1; c++)
				dp[r][c] = Math.max(left[c], right[c]);
			
		}
		
		return dp[n][m];
	}
}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณต~

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€