4개의 댓글이 있습니다.
-
-
zzerross -
지적해주신 코드의 가독성 부분...저도 인정하는 바이구요. ㅜ.ㅜ
허접하게나마 dp table 부분을 설명해보면 다음과 같습니다._as: [0] a [1] b [2] abc [3] cd _cp: 0 1 2 3 0: 1, 0 0,-1 1, 0 0,-1 1: 0,-1 1, 0 0,-1 0,-1 2: 1, 1 1, 1 3, 0 1, 0 3: 0,-1 0,-1 0,-1 2, 0 _dp: m=3 : 0 1 2 3 0x 0: 0000: , , , , 0x 1: 1000: 1,-1 , , , 0x 2: 0100: , 1,-1 , , 0x 3: 1100: 2, 1 2, 0 , , 0x 4: 0010: , , 3,-1 , 0x 5: 1010: 3, 2 , 3, 0 , 0x 6: 0110: , 3, 2 4, 1 , 0x 7: 1110: 3, 2 3, 2 4, 0 , 0x 8: 0001: , , , 2,-1 0x 9: 1001: 3, 3 , , 3, 0 0x a: 0101: , 3, 3 , 3, 1 0x b: 1101: 4, 1 4, 0 , 4, 0 0x c: 0011: , , 5, 3 4, 2 <- 가로 축의 각 문자열을 0x d: 1011: 5, 2 , 5, 0 4, 2 마지막으로 포함한 0x e: 0111: , 5, 2 6, 1 4, 2 최소 길이, 그 전 문자열 0x f: 1111: 5, 2 5, 2 6, 0 4, 2 <- 최소 문자열 조합 q: 3 2 0 <- 위 dp table을 0xf의 최소값에서 부터 따라 올라감 abcd <- 위 q를 역순으로 중복되는 부분을 생략하여 출력
11년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.

zzerross
[[problem:RESTORE]]
문제 1주일째 풀고 있네요.
주로 검산가능한 작은 데이터 위주로
random data로 200개 정도 검토해 보고,
coner case 수정했는데,
계속 오답으로 해매고 있습니다.
물론 최대 최소 긴 데이터들도 테스트해보긴 했구요.
최대한 스스로 풀어보려고 했건만, 몇일동안 못풀고 있어 질문 드립니다.
(iteration DP로 느리진 않을꺼라 생각했는데, 많이 느리기까지 하네요..)
코드 로직은 아래와 같구요.
- cmp(): 문자열 y 뒤에 x가 올때, 겹칠 수 있는 길이를 저장해서 cp[][]에 저장
- slv(): 모든 문자열 조합의 결과가 되는 문자열의 최소 길이를 dp table에 작성
- trk(): dp table에 작성된 최소 조합을 tracking하며 최소 문자열 출력
소스코드는 아래와 같습니다.
~~~ c++
#include
#define ss 15
#define sc 41
#define sr (ss * sc)
#define sf (1 << ss)
#define nf ((1 << ns) - 1)
int tc, ns, at[sc][sc];
char as[ss][sc];
struct cp {
int l, x;
} cp[ss][ss];
struct dp {
int l, t;
} dp[sf][ss];
struct q {
int b[ss], r;
} q;
void read() {
scanf("%d", &ns);
}
void cmp(int y, int x) {
if (y == x)
return;
}
void cmp() {
for (int y = 0; y < ns; y++)
for (int x = 0; x < ns; x++)
cmp(y, x);
}
int slv() {
for (int i = 0; i < ns; i++)
dp[0][i].l = sr;
}
void trk(int i) {
q.r = -1;
}
int main() {
for (scanf("%d", &tc); tc--;) {
read();
}
~~~
11년 전