Study hard

(c++)백준 10942번: 팰린드롬? 본문

백준/DP

(c++)백준 10942번: 팰린드롬?

Nimgnoej 2020. 9. 14. 15:57

acmicpc.net/problem/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