๐ฏ ๋ชฉํ
- ์ฃผ์ด์ง DNA ๋ฌธ์์ด์์ KOI ์ ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ต์ฅ ์ ํจ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค.
- KOI ์ ์ ์ ์ ์:
at, gc๋ KOI ์ ์ ์.
- KOI ์ ์ ์ X โ
aXt, gXc๋ KOI ์ ์ ์.
- X, Y๊ฐ KOI ์ ์ ์ โ XY๋ KOI ์ ์ ์.
โ
ํต์ฌ ์์ด๋์ด
- DP[i][j]: i~j๊น์ง KOI ์ ์ ์ ์ค ์ต์ฅ ๊ธธ์ด
- ๋ ๊ฐ์ง ์ ์ด ๋ฐฉ์:
- ๊ฒฝ๊ณ ์กฐ๊ฑด: (i,j) ๊ฐ
a,t or g,c๋ก ๊ฐ์ธ์ง๋ค๋ฉด โ ๋ด๋ถ + 2
- ๋ถํ ๊ฒฐํฉ:
dp[i][j] = max(dp[i][k] + dp[k+1][j])
๐ง ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ
import java.io.*;
import java.util.*;
public class Main {
static int[][] dp;
static char[] dna;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
dna = br.readLine().toCharArray();
int n = dna.length;
dp = new int[n][n];
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
if (isPair(dna[i], dna[j])) {
dp[i][j] = Math.max(dp[i][j], 2 + (i + 1 <= j - 1 ? dp[i + 1][j - 1] : 0));
}
for (int k = i; k < j; k++) {
dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[k + 1][j]);
}
}
}
System.out.println(dp[0][n - 1]);
}
static boolean isPair(char a, char b) {
return (a == 'a' && b == 't') || (a == 'g' && b == 'c');
}
}
โฑ ์๊ฐ๋ณต์ก๋
- O(Nยณ): i, j, k ์ธ์ค ๋ฃจํ
- N โค 500์ด๋ฏ๋ก Java์์๋ ํต๊ณผ ๊ฐ๋ฅ
๐ก ์ ๋ฆฌ
- ์ด ๋ฌธ์ ๋ ์ ํ์ ์ธ ๋ฌธ์์ด DP ๋ฌธ์ ์ด๋ฉฐ, ๋ถํ ์ ๋ณต์ ์ฌ๊ณ ์ ๊ฒฝ๊ณ ์กฐ๊ฑด ์ฒ๋ฆฌ๊ฐ ํต์ฌ
dp[i][j] = max(๊ฒฝ๊ณ ํฌํจ, ๋ถํ ) ํํ๋ฅผ ์ ์ดํดํ์