<Algorithm> 68. 9251번 LCS (DP)
by BFine반응형
1. 9251번 LCS
심화 DP 문제, LCS는 두 문자열을 비교하여 겹치지 않아도 만들 수 있는 문자열을 뜻한다.
처음에 힌트를 보고 0 0 배열 부터 시작을 했는데 0번 배열에 0을 넣는 것이 알고리즘에서 필요하구나라는 것을 느꼈다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); String N = br.readLine(); String M = br.readLine(); String std[] = new String[N.length()+1]; String comp[] = new String[M.length()+1]; int dp[][] = new int[1001][1001]; for(int i = 1; i < N.length() + 1; i ++) { std[i] = N.charAt(i-1)+""; //가로 } for(int i = 1; i < M.length() + 1; i ++) { comp[i] = M.charAt(i-1)+""; // 세로 } System.out.println(Arrays.toString(std)); System.out.println(Arrays.toString(comp)); /*if(std.length > comp.length) { String temp_comp[] = comp.clone(); String temp_std[] = std.clone(); comp = temp_std; std = temp_comp; }*/ /* * */ for(int i = 1; i < M.length() + 1; i ++) { // 세로 for(int j = 1; j < N.length() + 1; j++) { // 가로 if(comp[i].equals(std[j])) { dp[i][j] = dp[i - 1][j - 1] + 1; }else { dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]); } } } /* * 0 A A A * 0 0 0 0 0 * A 0 1 1 * A 0 */ System.out.println(dp[M.length()][N.length()]); } } /*import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); String N = br.readLine(); String M = br.readLine(); String std[] = new String[N.length()]; String comp[] = new String[M.length()]; int dp[][] = new int[6][6]; for(int i = 0; i < N.length(); i ++) { std[i] = N.charAt(i)+""; //가로 } for(int i = 0; i < M.length(); i ++) { comp[i] = M.charAt(i)+""; // 세로 } if(std.length > comp.length) { String temp_comp[] = comp.clone(); String temp_std[] = std.clone(); comp = temp_std; std = temp_comp; } if(comp[0].equals(std[0])) { dp[0][0] = 1; } //comp 세로 std 가로 for(int j = 1; j < N.length(); j++) { if(comp[0].equals(std[j])) { dp[0][j] = 1; }else { dp[0][j] = dp[0][j-1]; } A C A Y K P * C 0 1 1 1 1 1 * A 1 1 2 2 2 2 * P 1 1 2 2 2 3 * A * A A A * A 1 1 1 * A 1 2 2 * } for(int i = 1; i < M.length(); i ++) { // 세로 for(int j = 0; j < N.length(); j++) { // 가로 if(j == 0) { if(comp[i].equals(std[j])) { dp[i][j] = dp[i - 1][j] + 1; }else { dp[i][j] = dp[i - 1][j]; } }else { if(comp[i].equals(std[j])) { dp[i][j] = dp[i - 1][j - 1] + 1; //dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]) + 1; }else { dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]); } } } } System.out.println(Arrays.deepToString(dp)); * 0 A C A Y K P * 0 0 0 0 0 0 0 0 * C 0 0 1 1 1 1 1 C - AC * A 0 1 1 2 2 2 2 CA - ACA * P 0 * C 0 * A 0 * K 0 System.out.println(dp[M.length()-1][N.length()-1]); } }*/ | cs |
참고 & 출처 http://twinw.tistory.com/126
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 70. 2819번 격자판의 숫자 이어붙이기(SW Expert) (0) | 2018.08.29 |
---|---|
<Algorithm> 69. 2163번 초콜릿 자르기 (0) | 2018.08.29 |
<Algorithm> 67. 2293번 동전 1 (0) | 2018.08.27 |
<Algorithm> 66. 11727번 2*n 타일링 2 (0) | 2018.08.27 |
<Algorithm> 65. 14675번 단절점과 단절선 (0) | 2018.08.25 |
블로그의 정보
57개월 BackEnd
BFine