알고리즘문제 풀어보기/백준

백준 - 19042 팰린드롬

rimugiri 2024. 10. 9. 00:51
728x90

 

해결과정 - DP

첫번째 방법 무식하게 푸는 방법은 모두가 생각한듯이 S, E가 주어졌을때 {S, E} {S - 1, E - 1} 이런식으로 비교를 해가며 푸는 방식이다 하지만 질문 M이 많을경우 약 n^2 * m의 시간복잡도가 발생하게 된다

 

두번째 방식은 S와 E의 값이 같을때 S와 E의 안쪽이 팰린드롬이면 S 와 E도 팰린드롬이라는 것에서 미리 팰린드롬 보드를 제작할수 있다 1일때는 팰린드롬임이 분명하고 2일때부터 위의 발상을 적용할 수 있다 위를 표현하면

if(S == E) 일때 board[Length][Start] = board[Length - 2][Start + 1] 이라는 공식이 나오게 된다

계산의 편리성을 위해 board는 1부터 시작하도록 구성하였다

 

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<deque>
#include<unordered_set>
#include<unordered_map>
#include<cmath>

#define Fast ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
using namespace std;

typedef long long ll;

int board[2001][2001];

int main() {
	Fast;
	
	int n;
	cin >> n;

	vector<int> arr(n);
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}

	for (int i = 0; i <= n; i++) {
		for(int j = 0; j <= n; j++)
			board[i][j] = 1;
	}

	//보드를 초기화 한다
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= n - i + 1; j++) {
			if(arr[j - 1] == arr[j + i - 2])
				board[i][j] = board[i - 2][j + 1];
			else
				board[i][j] = 0;
		}
	}

	int m;
	cin >> m;

	for (int i = 0; i < m; i++) {
		int S, E;
		cin >> S >> E;

		int diff = E - S + 1;

		cout << board[diff][S] << '\n';
	}
	return 0;
	
}

 

후기

골드문제는 아닌듯하다

728x90

'알고리즘문제 풀어보기 > 백준' 카테고리의 다른 글

백준 - 9466 텀 프로젝트  (0) 2024.10.10
백준 - 1005 ACM Craft  (0) 2024.10.09
백준 - 2239 스도쿠  (0) 2024.10.08
백준 - 2467 용액  (1) 2024.10.07
백준 2166 - 다각형의 넓이  (0) 2024.10.07