Koder / 박성훈
article thumbnail

DP문제

 

https://www.acmicpc.net/problem/10942

 

10942번: 팰린드롬?

총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.

www.acmicpc.net

dp[i][j]를 i번째 수부터 j번째 수까지 붙여 만든 문자열이 팰린드롬인가? (1 or 0) 으로

정의해주면 된다

일단 i와 j가 같은 경우에는 항상 팰린드롬일 것이고, 길이가 짝수인 팰린드롬은 i+1 와 j 번째 숫자가 같아야 한다.

이것들을 먼저 처리해 큐에 넣어주고

BFS를 통해 순회해주며 DP배열을 채우면 된다.

 

<c++ />
#include <bits/stdc++.h> using namespace std; int dp[2345][2345] = {0}; // i부터 j까지 수가 팰린드롬인가? T/F int arr[2345] = {0}; queue<pair<int,int>> q; int main(){ ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); int n; cin >> n; for(int i=0; i<n; i++) cin >> arr[i]; for(int i=0; i<2345; i++){ dp[i][i] = 1; q.push({i,i}); } for(int i=1; i<n; i++) if(arr[i-1] == arr[i]){ dp[i-1][i] = 1; q.push({i-1,i}); } while(!q.empty()){ auto p = q.front(); q.pop(); int s = p.first; int e = p.second; if(s>e) continue; if(0<=s-1 && e+1<n && arr[s-1] == arr[e+1]){ dp[s-1][e+1] = 1; q.push({s-1,e+1}); } } int m,s,e; cin >> m; for(int i=0; i<m; i++){ cin >> s >> e; cout << dp[s-1][e-1] << "\n"; } return 0; }
반응형