๐ ๋ฐฑ์ค 2616๋ฒ: ์ํ๊ธฐ๊ด์ฐจ
๐ฏ ๋ฌธ์ ์์ฝ
- N๊ฐ์ ๊ฐ์ฐจ(1 ≤ N ≤ 50,000)๊ฐ ์์ง์ ์์ ์๋ค.
- ๊ฐ ๊ฐ์ฐจ์๋ ์๋์ด ํ๊ณ ์๋ค (์ต๋ 100๋ช
).
- ์ํ ๊ธฐ๊ด์ฐจ๋ ์ต๋
K์นธ๊น์ง ๋ ์ ์์ผ๋ฉฐ, ์ด 3๋๊ฐ ์กด์ฌํ๋ค.
- 3๊ฐ์ ์ํ ๊ธฐ๊ด์ฐจ๊ฐ ์๋ก ๊ฒน์น์ง ์๊ฒ ์ดํฉ ์๋ ์๊ฐ ์ต๋๊ฐ ๋๋๋ก ์ดํํ ๋์ ์ต๋ ์๋ ์๋ฅผ ๊ตฌํ๋ผ.
๐ง ๋ฌธ์ ์ ๊ทผ
โ
ํต์ฌ ๊ฐ๋
- 3๊ฐ์ ๊ธฐ๊ด์ฐจ๊ฐ ๋ ์ ์๋ ๊ฐ์ฐจ๋ฅผ ๋น์ค๋ณต์ผ๋ก ์ ํ → ๊ตฌ๊ฐ ํฉ ์ต์ ํ
๋์ ํฉ + DP ์ฌ์ฉ
dp[i][j]: i๋ฒ์งธ ๊ธฐ๊ด์ฐจ๊น์ง ์ฌ์ฉํด์, j๋ฒ์งธ ๊ฐ์ฐจ๊น์ง ํ์ํ์ ๋ ์ต๋๊ฐ
๐ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
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));
int N = Integer.parseInt(br.readLine());
int[] people = new int[N + 1];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 1; i <= N; i++) {
people[i] = Integer.parseInt(st.nextToken());
}
int K = Integer.parseInt(br.readLine());
int[] total = new int[N + 1];
for (int i = 1; i <= N; i++) {
total[i] = total[i - 1] + people[i];
}
int[][] dp = new int[4][N + 1];
for (int i = 1; i <= 3; i++) {
for (int j = K * i; j <= N; j++) {
int curtotal = total[j] - total[j - K];
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j - K] + curtotal);
}
}
System.out.println(dp[3][N]);
}
}
โ
์๊ฐ ๋ณต์ก๋
- ๋์ ํฉ ๊ณ์ฐ: O(N)
- DP ํ
์ด๋ธ ์ฑ์ฐ๊ธฐ: O(N)
- ์ ์ฒด ์๊ฐ๋ณต์ก๋: O(N) → N ≤ 50,000 ์ด๋ฏ๋ก ์ถฉ๋ถํ ํต๊ณผ ๊ฐ๋ฅ
๐ก ์ ๋ฆฌ
- ํต์ฌ์ ๋น์ค๋ณต ๊ตฌ๊ฐ ํฉ ์ต์ ํ ๋ฌธ์ ๋ฅผ DP + ๋์ ํฉ์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ
- ์ํ ์ ์ด:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - K] + sum(j-K+1 ~ j))
- ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ ๋์ด๋๋ ๋ฎ์ง๋ง, ์ํ ์ ์๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค