형식의 테이블을 만들고, 위의 테이블에 k번째에 0~n까지 터트릴 수 있는 경우의 비용을 누적하여 테이블을 만들었습니다.
그리고 여러 케이스를 손으로 그린 후 소스로 돌려 테스트해봤는데 혼자서는 도저히 오답이 나는 이유를 찾을 수가 없어서 도움을 받고자 이렇게 글을 쓰게 되었습니다.
부탁드립니다. 오답 케이스좀 찾아주세요 ㅠ.ㅠ
importjava.util.Scanner;publicclassMain{intk,n;int[][]cloude;int[][]cache;inttotalXpos=10000;intINF;publicstaticvoidmain(String[]args){newMain();}publicMain(){Scannerscn=newScanner(System.in);intcnt=scn.nextInt();for(inti=0;i<cnt;i++){input(scn);sort();makeCache();//printCache();System.out.println(cache[k-1][n-1]);}scn.close();}publicvoidinput(Scannerscn){n=scn.nextInt();k=scn.nextInt();cloude=newint[n][2];cache=newint[k+1][n+1];INF=k*totalXpos*2;for(inti=0;i<n;i++){cloude[i][0]=scn.nextInt();cloude[i][1]=scn.nextInt();}}publicvoidsort(){for(inti=0;i<n;i++){for(intj=i;j<n;j++){if(cloude[i][0]>cloude[j][0]){inttemp0=cloude[i][0];inttemp1=cloude[i][1];cloude[i][0]=cloude[j][0];cloude[i][1]=cloude[j][1];cloude[j][0]=temp0;cloude[j][1]=temp1;}}}}publicvoidmakeCache(){for(inti=0;i<n;i++){booleanflag=true;intremainedCloudeCnt=0;//초기화for(intj=0;j<=i;j++){if((cloude[i][0]<=cloude[j][0]&&cloude[i][1]>=cloude[j][0])||(cloude[i][0]<=cloude[j][1]&&cloude[i][1]>=cloude[j][1]))remainedCloudeCnt++;elseflag=false;}if(flag)cache[0][i]=cloude[i][0]*remainedCloudeCnt;elsecache[0][i]=INF;}for(inti=1;i<k;i++){for(intj=0;j<n;j++)cache[i][j]=cache[i-1][j];for(intj=0;j<n;j++){intlast=-1;//이전 단계에 없어진 마지막 구름을 찾아서for(intcheck=j-1;check>=0;check--){if(cache[i-1][check]!=INF){last=check;break;}}booleanflag=true;while(flag&&last>=0){intremainedCloudeCnt=0;//나머지 구름을 다 없엘 수 있나 확인for(intcheck=j;check>last;check--){if((cloude[j][0]<=cloude[check][0]&&cloude[j][1]>=cloude[check][0])||(cloude[j][0]<=cloude[check][1]&&cloude[j][1]>=cloude[check][1]))remainedCloudeCnt++;elseflag=false;}//없엘 수 있으면 계산if(flag)cache[i][j]=Math.min(cache[i][j],(last==-1?0:cache[i-1][last])+cloude[j][0]*(remainedCloudeCnt));last--;}}}}//cache 검증용publicvoidprintCache(){for(inti=0;i<cache.length;i++){for(intj=0;j<cache[i].length;j++)System.out.print(cache[i][j]+" ");System.out.println();}}}
10년 전
0개의 댓글이 있습니다.
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면
온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야
합니다. 현재 문제를 푸셨습니다.
tkagksmsen
안녕하세요
CLEARSKYPROJECT를 푸는 도중에 오답이 떠서 어떠한 케이스가 비어있는지 스스로 체크가 힘들어 이렇게 글을 쓰게 되었습니다.
먼제 제가 푼 방식은 Sort 이후 동적계획법을 이용하여
D[k][n] = last{D[k - 1][0] ~ D[k - 1][n]} + xPos * 구름수
형식의 테이블을 만들고, 위의 테이블에 k번째에 0~n까지 터트릴 수 있는 경우의 비용을 누적하여 테이블을 만들었습니다.
그리고 여러 케이스를 손으로 그린 후 소스로 돌려 테스트해봤는데 혼자서는 도저히 오답이 나는 이유를 찾을 수가 없어서 도움을 받고자 이렇게 글을 쓰게 되었습니다.
부탁드립니다. 오답 케이스좀 찾아주세요 ㅠ.ㅠ
10년 전