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

 

1749๋ฒˆ: ์ ์ˆ˜๋”ฐ๋จน๊ธฐ

๋™์ฃผ๋Š” ํ•ญ์ƒ ํ˜ผ์ž ๋…ธ๋Š๋ผ ์‹ฌ์‹ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํ˜ผ์ž ๋†€๊ธฐ์˜ ๊ณ ์ˆ˜๊ฐ€ ๋œ ๋™์ฃผ๋Š” ๋งค์ผ๋งค์ผ ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•˜์—ฌ ํ˜ผ์ž๋†€๊ธฐ์˜ ์ง„์ˆ˜๋ฅผ ์šฐ๋ฆฌ์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค. ์–ด๋Š ๋‚  ๋™์ฃผ๋Š” ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์„ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ๋ฐ”๋กœ ์ 

www.acmicpc.net

 

 

 

 

 

๋ฌธ์ œ

  • ์ผ๋‹จ N*M ํ–‰๋ ฌ์„ ๊ทธ๋ฆฐ ๋‹ค์Œ, ๊ฐ ์นธ์— -10,000 ์ด์ƒ 10,000 ์ดํ•˜์˜ ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์“ด๋‹ค.
  • ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ทธ ํ–‰๋ ฌ์˜ ๋ถ€๋ถ„ํ–‰๋ ฌ์„ ๊ทธ๋ ค ๊ทธ ์•ˆ์— ์ ํžŒ ์ •์ˆ˜์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฒŒ์ž„์ด๋‹ค.
  • ์ •์ˆ˜์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„ํ–‰๋ ฌ์„ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 

 

ํ’€์ด

์ฒ˜์Œ์—๋Š” ์ด์ „์— ํ’€์—ˆ๋˜ '๋ถ€๋ถ„ํ–‰๋ ฌ์—์„œ ๋ถ€๋ถ„ํ•ฉ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ'์˜ ์ ‘๊ทผ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ํ’€์—ˆ๋‹ค.

 

๋ฐฑ์ค€ 11660๋ฒˆ ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ5 : https://www.acmicpc.net/problem/11660

(ํ’€์ด) ๋ฐฑ์ค€ 11660๋ฒˆ ๊ตฌ๊ฐ„ ํ•ฉ ๊ตฌํ•˜๊ธฐ5 : https://programmingiraffe.tistory.com/160

 

 

 

[๋ฐฉ๋ฒ•1] O(N^4) ํ’€์ด => 1000ms๋Œ€

 

1. dp[i][j]๋กœ (1, 1)~(i, j)์˜ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j]

 

 

 

 

2. ๋ชจ๋“  ์ ์— ๋Œ€ํ•ด (x1, y1)๋ถ€ํ„ฐ (x2, y2)์˜ ํ•ฉ ๊ตฌํ•˜๊ณ , ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 

 

 

dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]

 

 

 ๋ชจ๋“  ์ ์— ๋Œ€ํ•ด ํƒ์ƒ‰์„ ํ•˜๊ธฐ ์œ„ํ•ด 4์ค‘ for๋ฌธ์„ ํ†ตํ•ด, x2 > x1, y2 > y1 ์ ์— ๋Œ€ํ•ด ์œ„ DP ์‹์„ ํ†ตํ•ด ๋ˆ„์ ํ•ฉ ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๊ณ , ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ–ˆ๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.io.*;
import java.util.*;

public class Main {

	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 + 1][M + 1];
		
		for(int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 1; j <= M; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int[][] dp = new int[N + 1][M + 1]; //ํ–‰๋ ฌ (i, j)๊นŒ์ง€์˜ ํ•ฉ
		
		//ํ–‰๋ ฌ(1,1)~(i, j)๊นŒ์ง€์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= M; j++) {
				dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + arr[i][j];
			}
		}
		
		//ํ–‰๋ ฌ(x1,y1)~(x2, y2)๊นŒ์ง€์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
		int max = Integer.MIN_VALUE;
		
		for(int x1 = 1; x1 <= N; x1++) {
			for(int y1 = 1; y1 <= M; y1++) {
				for(int x2 = x1; x2 <= N; x2++) {
					for(int y2 = y1; y2 <= M; y2++) {
						max = Math.max(max, dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]);
					}
				}
			}
		}
		
		System.out.println(max);
	}

}

 

 

 

 O(N^2 * M^2)์œผ๋กœ ๋‹น์—ฐํžˆ ๋น„ํšจ์œจ์ ์ด๊ณ , ์ฑ„์ ์ƒ์œผ๋กœ 1000ms ๋Œ€์˜ ์‹œ๊ฐ„์ด ๋‚˜์˜ค๋Š” ํ’€์ด๋‹ค.

ํ•˜์ง€๋งŒ N๊ณผ M์ด 200๋ฏธ๋งŒ์ด๊ณ , x2 > x1, y2 > y1์ธ ๋ชจ๋“  ์ ์— ๋Œ€ํ•ด ๊ตฌํ•˜๊ณ , ๋ฌธ์ œ์˜ ์ œํ•œ์‹œ๊ฐ„์ด 2์ดˆ์ด๋‹ˆ ํ†ต๊ณผ๊ฐ€ ๋œ๋‹ค. ๋งŒ์•ฝ 1์ดˆ์˜€๋‹ค๋ฉด ์ด ํ’€์ด๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ํ†ต๊ณผ๋ฅผ ๋ชปํ–ˆ์„ ๊ฒƒ์ด๋‹ค..

 

 

 

 

 

[๋ฐฉ๋ฒ•2] O(N ^3) ํ’€์ด => 300ms๋Œ€

 

 

1. dp[i][j] : ํ–‰ ๋ณ„ ๋ˆ„์ ํ•ฉ ๊ตฌํ•˜๊ธฐ

 

ํ–‰ ๋ณ„๋กœ dp[i][0]~ dp[i][M] ๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•ด๋‚˜๊ฐ„๋‹ค. 

 

 

 

2. ํ–‰์˜ ๋ถ€๋ถ„ ๊ธธ์ด ํ•ฉ์„ ๊ตฌํ•˜๊ณ , ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด ๊ทธ ํ•ฉ์„ ์Œ“๊ธฐ

 

 ํ•œ ํ–‰์˜ ๋ชจ๋“  ๋ถ€๋ถ„ ๊ธธ์ด ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด 2์ค‘ for๋ฌธ์œผ๋กœ i < j์ธ ๊ฐ’์— ๋Œ€ํ•ด, ํ•œ ํ–‰์˜ j์—ด๊นŒ์ง€์˜ ํ•ฉ์— i์—ด๊นŒ์ง€์˜ ํ•ฉ์„ ๋นผ์ค€๋‹ค.

 

 ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํ–‰์„ ํ•œ ์ค„์”ฉ ์Œ“์•„๋‚˜๊ฐ€๋ฉฐ, ์ตœ๋Œ“๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ํ–‰์˜ ๋ถ€๋ถ„ ๊ธธ์ด ํ•ฉ์ด ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ๋ณด๋‹ค ํฌ๋‹ค๋ฉด, ๋ˆ„์ ํ•ฉ์„ ํ˜„์žฌ ํ–‰์˜ ๋ถ€๋ถ„ ๊ธธ์ด ํ•ฉ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด์ „์ฒ˜๋Ÿผ ๋˜ ์•ˆ์— 2 for๋ฌธ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  (y1~y2)์˜ ๋ˆ„์ ํ•ฉ์„ ๊ตฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค!

 

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด O(N^3)์œผ๋กœ ํ’€์ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

	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 + 1][M + 1];
		
		for(int i = 1; i <= N; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j = 1; j <= M; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		int[][] dp = new int[N + 1][M + 1]; //ํ–‰๋ ฌ (i, 0)~(i, j)๊นŒ์ง€์˜ ํ•ฉ
		
		for(int i = 1; i <= N; i++) {
			for(int j = 1; j <= M; j++) {
				dp[i][j] = dp[i][j - 1] + arr[i][j];
			}
		}
		
		int max = Integer.MIN_VALUE; //์ •๋‹ต : ๋ถ€๋ถ„ ํ–‰๋ ฌ ํ•ฉ์˜ ์ตœ๋Œ€
		
		for(int i = 1; i <= M; i++) {
			for(int j = i; j <= M; j++) {
				int sum = 0;
				for(int k = 1; k <= N; k++) { //ํ–‰ ๋Š˜๋ ค๊ฐ
					int row = dp[k][j] - dp[k][i - 1]; //ํ•œ์ค„
					sum += row; //ํ•œ์ค„ ๋”ํ•จ
					if(row > sum) sum = row; //ํ•œ์ค„ ์ด ๋” ํฌ๋ฉด, ์ด์ „ ๊ธฐ๋ก ๋ฒ„๋ฆฌ๊ณ  sum์„ ๊ฐฑ์‹ 
					max = Math.max(max, sum); //์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
				}
			}
		}
		
		System.out.println(max);
	}

}

 

 

 

 

 

๊ฒฐ๊ณผ

 

[๋ฐฉ๋ฒ•1] O(N^4) ํ’€์ด : 1000ms๋Œ€

[๋ฐฉ๋ฒ•2] O(N^3) ํ’€์ด : 300ms๋Œ€

 

 

 

 

 

๋ฐฐ์šด์ 

giraffe_