https://www.acmicpc.net/problem/1749
๋ฌธ์
- ์ผ๋จ 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๋
๋ฐฐ์ด์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 15486๋ฒ : ํด์ฌ2 (0) | 2024.01.14 |
---|---|
๋ฐฑ์ค 20440๋ฒ : ๐ต๋๊ฐ ์ซ์ด ์ซ์ด ๋๋ฌด ์ซ์ด ์ซ์ด ์ค์ง ๋ง ๋ด๊ฒ ์ฐ์ฉ๋์ง๋ง๐ต - 1 (0) | 2024.01.13 |
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |
๋ฐฑ์ค 11660๋ฒ : ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ5 (0) | 2024.01.12 |
๋ฐฑ์ค 20922๋ฒ : ๊ฒน์น๋ ๊ฑด ์ซ์ด (0) | 2024.01.09 |