티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
문제에 포함된 예를 보자.
1. Top-Down
길이가 \( l \) 인 수열이 팰린드롬인지 여부는 양끝을 조사해서 다르면 그대로 종료하고,
같으면 양끝을 제거한 \( l-2 \) 인 수열을 살펴보면 된다.
#include<bits/stdc++.h>
using namespace std;
int arr[20001], dp[2001][2001];
int recur(int s,int e){
if(s==e) return 1;
if(s+1==e) {
if(arr[s]==arr[e]) return 1;
else return 0;
}
int &ret=dp[s][e];
if(ret!=-1) return ret;
if(arr[s]==arr[e]) return ret=recur(s+1,e-1);
return ret=0;
}
int main(){
memset(dp, -1, sizeof dp);
int n; scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
int m; scanf("%d",&m);
while(m--){
int a,b; scanf("%d%d",&a,&b);
printf("%d\n", recur(a,b));
}
}
recur 함수 내에서 분기가 최대 2 개이고 순서쌍 (i,j) 는 \(O (n^2) \) 이므로 전체적으로 \(O (n^2) \) 로 동작.
2. Bottom-Up
길이를 1, 2, 3, ... 차례로 늘려가면서 앞서서 구해둔 짧은 길이 수열의 정보를 이용.
#include<bits/stdc++.h>
using namespace std;
int arr[2001], dp[2001][2001];
int main(){
memset(dp,-1,sizeof dp);
int n; scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&arr[i]);
dp[i][i]=1;
dp[i-1][i]=arr[i-1]==arr[i]?1:0;
}
for(int l=3;l<=n;l++){
for(int i=1;i+l-1<=n;i++){
int e=i+l-1;
if(arr[i]==arr[e])
dp[i][e]=dp[i+1][e-1];
else
dp[i][e]=0;
}
}
int m; scanf("%d",&m);
while(m--){
int a,b; scanf("%d%d",&a,&b);
printf("%d\n", dp[a][b]);
}
}
for 루프가 두 번 충첩되어 있으므로 \( O(n^2 )\) 으로 동작.
덜렁거리는 성격이라 dp 초기화와 관련된 실수가 잦은데... 정신차리자.
반응형
'DS\Algo > Dynamic Programming' 카테고리의 다른 글
BOJ 12852 1로 만들기 2 (0) | 2022.09.22 |
---|---|
BOJ 17070 파이프 옮기기 1 (2) | 2022.09.19 |
BOJ 1915 가장 큰 정사각형 (0) | 2022.09.15 |
BOJ 11066 Merging Files(파일 합치기) (0) | 2022.09.14 |
BOJ 11048 이동하기 (0) | 2022.09.11 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Shell Programming
- RUBY
- C++ big number
- fenwick tree
- bash script
- 백준
- script
- nearest common ancestor
- Reference
- Vim
- map
- 정수론
- Dijkstra
- 세그먼트 트리
- dynamic programming
- Aho-Corasick
- python3
- math font
- JavaScript
- bash
- BOJ
- stack
- segment tree
- shell
- persistent segment tree
- javascript array
- lazy propagation
- max flow
- 다익스트라
- number theory
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함