https://www.acmicpc.net/problem/10211
10211๋ฒ: Maximum Subarray
ํฌ๊ธฐ N์ธ ์ ์ํ ๋ฐฐ์ด X๊ฐ ์์ ๋, X์ ๋ถ๋ถ ๋ฐฐ์ด(X์ ์ฐ์ํ ์ผ๋ถ๋ถ) ์ค ๊ฐ ์์์ ํฉ์ด ๊ฐ์ฅ ํฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฐพ๋ Maximum subarray problem(์ต๋ ๋ถ๋ถ๋ฐฐ์ด ๋ฌธ์ )์ ์ปดํจํฐ ๊ณผํ์์ ๋งค์ฐ ์ ์๋ ค์ ธ ์
www.acmicpc.net
๐ฅ ๋ธ๋ฃจํธํฌ์ค๋ก ํธ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋ฌธ์ ๋ฅผ ๋ณด์๋ง์ DP๊ฐ ๋ ์ฌ๋ผ์ DP ํ์ด๋ณด์๋ค.
- ์ง๊ธ๊น์ง์ ๋ถ๋ถ๋ฐฐ์ด์ ์ต๋ ํฉ์ ์ ์ฅํ dp๋ฐฐ์ด์ ๋ง๋ ๋ค.
- dp[0] = arr[0]์ผ๋ก ์ด๊ธฐํํ๋ค.
- dp[1] ~ dp[n]๊น์ง ์ฑ์ด๋ค
- ๋งค ์ธ๋ฑ์ค๋ง๋ค ๋ค์ ๋ ๊ฐ์ง ์ ํ์ง๊ฐ ์๊ธด๋ค.
1) ํ์ฌ๊น์ง์ ์ต๋ ํฉ(dp[i-1])์ ํ์ฌ๊ฐ(arr[i])์ ๋ํ๊ฑฐ๋(์ฆ, ๋ถ๋ถ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ก์ ํ์ฌ๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋)
2) ํ์ฌ๊น์ง์ ์ต๋ํฉ์ ๋ฒ๋ฆฌ๊ณ , ํ์ฌ๊ฐ(arr[i])์ ์์์ผ๋ก ํ๋ ์๋ก์ด ๋ถ๋ถ๋ฐฐ์ด์ ๋ง๋ค๊ฑฐ๋
- ์ผ๋ฐํญ์ผ๋ก ๋ค์ ๋ํ๋ด๋ณด๋ฉด
1 ) dp[i] = dp[i-1] + arr[i]
2 ) dp[i] = arr[i]
- Maximum Subarray๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ์ด ์ค์์ ํฐ ๊ฐ์ ๊ณ ๋ฅด๋ฉด ๋๋น.
- dp ๋ฐฐ์ด ์ค ์ต๋๊ฐ์ด ์ ๋ต์ด๋ค.
๐ฅ Java ์ ๋ต ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
for (int t=0; t<T; t++){
// ์
๋ ฅ๋ฐ๊ธฐ
int n = Integer.parseInt(reader.readLine());
String[] strArr = reader.readLine().split(" ");
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(strArr[i]);
}
// dp๋ฐฐ์ด ์์ฑ ๋ฐ ์ด๊ธฐํ
int[] dp = new int[arr.length];
dp[0] = arr[0];
// dp๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
for(int i=1; i<arr.length; i++){
dp[i] = Math.max(arr[i]+dp[i-1], arr[i]);
}
// ์ต๋ ํฉ ๊ตฌํ๊ธฐ
int answer = dp[0];
for(int i=1; i<arr.length; i++){
answer = Math.max(answer, dp[i]);
}
// ๊ฒฐ๊ณผ์ถ๋ ฅ
System.out.println(answer);
}
}
}
๐ฅ Kandane's Algorithm
- ์ด ๋ฌธ์ ๋ฅผ ํธ๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค๊ณ ํด์ ์ด๊ฑธ๋ก๋ ์ฝ๋๋ฅผ ์ง๋ดค๋ค.
- sum์ ์ ๋ถ ๊ตฌํ๊ณ ๋์ ์ต๋๊ฐ์ ๊ตฌํ์ง ์๊ณ ๊ทธ๋๊ทธ๋ ๊ฐฑ์ ํด์ ์ฝ๋๊ฐ ์ข ๋ ๊ฐ๊ฒฐํด์ก๋ค
- dp๋ ๊ฑฐ์ ๋น์ทํ ๊ฒ ๊ฐ์๋ฐ ์กฐ๊ธ ๋ ์ง๊ด์ ์ธ๋ฏ..?
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(reader.readLine());
for (int t=0; t<T; t++){
int n = Integer.parseInt(reader.readLine());
String[] strArr = reader.readLine().split(" ");
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(strArr[i]);
}
int answer = -Integer.MAX_VALUE;
int currentSum = 0;
for(int i : arr){
currentSum = Math.max(currentSum + i, i);
answer = Math.max(answer, currentSum);
}
System.out.println(answer);
}
}
}
์ - Kandane's Algorithm
์๋ - DP
'์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด > DP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2xn ํ์ผ๋ง 1, 2 (0) | 2024.11.13 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค]ํธํ ๋์ค (0) | 2023.06.22 |
[ํ๋ก๊ทธ๋๋จธ์ค]๋ ๋ฐ๋จน๊ธฐ (0) | 2023.06.10 |
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฉ๋ฆฌ ๋ฐ๊ธฐ (0) | 2023.05.31 |
[๋ฐฑ์ค]1149๋ฒ: RGB๊ฑฐ๋ฆฌ (0) | 2023.05.27 |