RESTORE 문제 질문입니다. ljs921026 책에 있는 코드를 썼을 때 결과가 잘 안나와서 reconstruct 부분의 return 부분만 수정했는데 예제는 이상없이 나오는데 왜 오답이 계속 뜨는지 모르겠습니다. import java.util.*; public class Main { static int[][] overlap;//overlap 저장 static ArrayList word;//문자열 저장 static int len;//저장된 문자열 갯수 (포함된 문자열 제외) static int[][] cache; public static void main(String[] args) { Scanner sc=new Scanner(System.in); int num=sc.nextInt(); while(num-->0) { int n=sc.nextInt(); word=new ArrayList<String>(); sc.nextLine(); for(int i=0;i<n;i++) { String input=sc.nextLine(); int flag=1; for(int j=0;j<word.size();j++) { if(word.get(j).contains(input)) { flag=0; break; } } if(flag==1) word.add(input); } len=word.size(); overlap=new int[len][len]; overlap(); cache=new int[len][1<<len]; for(int i=0;i<len;i++) Arrays.fill(cache[i], -1); System.out.println(reconstruct(0,0)); } sc.close(); } public static void overlap() { for(int i=0;i<len;i++) { for(int j=0;j<len;j++) { if(i!=j) { overlap[i][j]=0; String a=word.get(i); String b=word.get(j); int len=Math.min(a.length(), b.length()); for(int k=1;k<=len;k++) { if(a.substring(a.length()-k, a.length()).equals(b.substring(0, k))) overlap[i][j]=k; } } } } } public static int restore(int last,int used) { if(used==(1<<len)-1) return 0; if(cache[last][used]!=-1) return cache[last][used]; cache[last][used]=0; for(int next=0;next<len;next++) { if((used&(1<<next))==0) { int cand=overlap[last][next]+restore(next,used+(1<<next)); cache[last][used]=Math.max(cache[last][used], cand); } } return cache[last][used]; } public static String reconstruct(int last,int used) { if(used==(1<<len)-1) return ""; for(int next=0;next<len;next++) { if((used&(1<<next))!=0)continue; int ifUsed=overlap[last][next]+restore(next,used+(1<<next)); if(restore(last,used)==ifUsed) { //최대값일때 String ret=""; if(used==0) ret+=word.get(next).substring(0, overlap[last][next]); return ret+=(word.get(next).substring(overlap[last][next])+reconstruct(next,used+(1<<next))); } } return "error"; } } 5년 전
0개의 댓글이 있습니다. 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
ljs921026
책에 있는 코드를 썼을 때 결과가 잘 안나와서
reconstruct 부분의 return 부분만 수정했는데
예제는 이상없이 나오는데 왜 오답이 계속 뜨는지 모르겠습니다.
import java.util.*;
public class Main { word;//문자열 저장
static int[][] overlap;//overlap 저장
static ArrayList
static int len;//저장된 문자열 갯수 (포함된 문자열 제외)
static int[][] cache;
}
5년 전