Study hard
(c++)백준 10942번: 팰린드롬? 본문
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
[풀이]
팰린드롬이란 수열이 거꾸로 했을 때도 같은 수열인 경우를 말한다.
가장 작은 단위의 수열(1개)부터 범위를 늘리면서 팰린드롬 여부를 판단하는 DP를 사용하였다.
DP[i][j]: S가 i이고 E가 j일 때 팰린드롬인지 여부
DP[i][i] = 1
if Num[i]==Num[j] : DP[i][i+1]=1
DP[i][j] = DP[i+1][j-1] && Num[i] == Num[j]
※cin, cout을 사용하면 시간초과가 나므로 scanf, printf 사용!
#include <iostream>
#include <cstring>
#define Max 2001
using namespace std;
int N, M;
int Num[Max];
int DP[Max][Max] = { 0, };
void solution() {
for (int i = 1; i <= N - 1; i++) {
DP[i][i] = 1;
if (Num[i] == Num[i + 1])
DP[i][i + 1] = 1;
}
DP[N][N] = 1;
if (N == 1 || N == 2)
return;
for (int d = 2; d <= N - 1; d++) {
for (int i = 1; i + d <= N; i++) {
int j = i + d;
if (DP[i + 1][j - 1] == 1 && Num[i] == Num[j])
DP[i][j] = 1;
}
}
}
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
scanf("%d", &Num[i]);
}
solution();
scanf("%d", &M);
int S, E;
for (int i = 1; i <= M; i++) {
scanf("%d %d", &S, &E);
printf("%d\n", DP[S][E]);
}
return 0;
}
'백준 > DP' 카테고리의 다른 글
(c++)백준 11066번: 파일 합치기 (0) | 2020.09.15 |
---|---|
(c++)백준 15989번: 1, 2, 3 더하기 4 (0) | 2020.09.14 |
(c++)백준 15486번: 퇴사 2 (0) | 2020.09.14 |
(c++)백준 14501번: 퇴사 (0) | 2020.09.14 |
(c++)백준 11060번: 점프 점프 (0) | 2020.09.13 |