How We Coding

http://boj.kr/2216


d[i][j] = s의 i번째 문자열까지, t의 j번째 문자열까지의 최대 점수


< AC 코드 >


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
#include <stdio.h>
#include <string.h>
#define mINF 0x80000000
 
int a, b, c;
int slen, tlen;
char s[3005], t[3005];
int d[3005][3005];
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int go(int si, int ti)
{
    int ret = mINF;
    if(d[si][ti]!=mINF) return d[si][ti];
 
    if(si == slen) return b * (tlen-ti);
    if(ti == tlen) return b * (slen-si);
 
    if(s[si] == t[ti])
        ret = max(ret, go(si+1, ti+1)+a);
    if(s[si] != t[ti])
        ret = max(ret, go(si+1, ti+1)+c);
    ret = max(ret, go(si+1, ti)+b);
    ret = max(ret, go(si, ti+1)+b);
    return d[si][ti] = ret; 
}
 
int main()
{
    int i, j;
    scanf("%d%d%d%s%s"&a, &b, &c, s, t);
    slen = strlen(s);
    tlen = strlen(t);
    for(i=0; i<3005; i++for(j=0; j<3005; j++) d[i][j] = mINF;
    printf("%d\n", go(00)); 
    return 0;
}
 
cs


>> 0x8000000 : int 의 최소값이다.

>> 무조건 위에서 아래로 가도록 짜진 말아야겠다...



< 틀린 코드 >


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
#include <stdio.h>
#include <string.h>
#define mINF 0x80000000
 
int a, b, c;
char s[3005], t[3005];
int d[3005][3005];
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int go(int si, int ti)
{
    int ret = mINF;
    if(si < 0return b * (ti-1); 
    if(ti < 0return b * (si-1);
    if(d[si][ti]!=mINF) return d[si][ti];
 
    if(s[si] == t[ti])
        ret = max(ret, go(si-1, ti-1)+a);
    if(s[si] != t[ti])
        ret = max(ret, go(si-1, ti-1)+c);
    ret = max(ret, go(si-1, ti)+b);
    ret = max(ret, go(si, ti-1)+b);
    return d[si][ti] = ret; 
}
 
int main()
{
    int i, j;
    scanf("%d%d%d%s%s"&a, &b, &c, s, t);
    for(i=0; i<3005; i++for(j=0; j<3005; j++) d[i][j] = mINF;
    printf("%d\n", go(strlen(s)-1, strlen(t))-1); 
    return 0;
}
 
cs


>> 점화식은 맞는데, 18%에서 틀렸다고 한다. 왜 틀린건지 모르겠다...ㅜㅜ

>> 17, 18 에서의 탈출조건도 ti+1, si+1 인거 같은데, 이렇게 하면 테케도 통과를 못한다...


>> 위 코드에 대한 반례


5 -3 -6 

b


>> 정답코드에서는 -6이, 위 코드에서는 -4가 나온다...


'BOJ > DP' 카테고리의 다른 글

[10942] 팰린드롬?  (0) 2018.02.22
[1890] 점프  (0) 2018.02.22
[11048] 이동하기  (0) 2018.02.18
[9184] 신나는 함수 실행  (0) 2018.02.16
[2302] 극장 좌석  (0) 2018.02.05