[10942] 팰린드롬?
BOJ/DP2018. 2. 22. 23:49
DP - basic
d[i][j] = i~j 까지가 팰린드롬인지.
< 소스코드 >
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 | #include <stdio.h> #include <string.h> int p[2001]; int d[2001][2001]; int isP(int s, int e) { int i; if(s >= e) return 1; if(d[s][e] != -1) return d[s][e]; if(p[s] != p[e]) return 0; return d[s][e] = isP(s+1, e-1); } int main() { int i, j, n, m; scanf("%d", &n); for(i=1; i<=n; i++) scanf("%d", p+i); memset(d, -1, sizeof(d)); scanf("%d", &m); while(m--) { int a, b; scanf("%d%d", &a, &b); printf("%d\n", isP(a, b)); } return 0; } | cs |
>> 모든 경우를 다 구해놓고 하려다가 시간만 쓰고, 머리만 쓴거 같다.
>> 쿼리마다 필요한걸 구하면서 그때 구한걸 저장해(메모이제이션) 놓으면 된다..
< 바텀업 >
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 | #include <cstdio> int n; int a[2000]; bool d[2000][2000]; int main() { scanf("%d",&n); for (int i=0; i<n; i++) { scanf("%d",&a[i]); } for (int i=0; i<n; i++) { d[i][i] = true; } for (int i=0; i<n-1; i++) { if (a[i] == a[i+1]) { d[i][i+1] = true; } } for (int k=3; k<=n; k++) { for (int i=0; i<=n-k; i++) { int j = i+k-1; if (a[i] == a[j] && d[i+1][j-1]) { d[i][j] = true; } } } int m; scanf("%d",&m); while (m--) { int s, e; scanf("%d %d",&s,&e); printf("%d\n",d[s-1][e-1]); } return 0; } | cs |
>> 과거 AC 받은 코드인데, 백준님 코드 같다.. 내스타일의 코드는 아니므로...
>> 길이가 1인 부분수열은 반드시 팰린드롬이다.
>> 길이가 2인 부분수열은 두 수가 같을때만 팰린드롬이다.
>> d[i][j] 가 팰린드롬이려면 a[i] == a[j] 이고 d[i+1][j-1] 이 팰린드롬이여야 한다.
'BOJ > DP' 카테고리의 다른 글
[9251] LCS (0) | 2018.04.21 |
---|---|
[14002] 가장 긴 증가하는 부분 수열 4 (0) | 2018.04.18 |
[1890] 점프 (0) | 2018.02.22 |
[2216] 문자열과 점수 (0) | 2018.02.21 |
[11048] 이동하기 (0) | 2018.02.18 |