레야몬
[C++] 10942번 팰린드롬? - DP 본문
#include <iostream>
#define LOOP(i, N) for(int i=1; i<=N; i++)
#define MAX_N 2001
using namespace std;
int N, M; //수열의 크기 N, 질문의 개수 M
int num[MAX_N]; //수열
int memo[MAX_N][MAX_N]; //메모
int S, E; //질문
void input()
{
cin >> N;
LOOP(i, N) cin >> num[i];
cin >> M;
}
int f(int l, int r)
{
if(memo[l][r]) return memo[l][r]; //이미 탐색함
//탐색하지 않음
if(!(r-l)) return memo[l][r]= 2;
if(r-l<=1) return memo[l][r]= (num[r]==num[l] ? 2:1);
return memo[l][r] = ((f(l+1, r-1)==2) && num[r]==num[l]) ? 2:1; //DP
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
input();
while(M--) {
cin >> S >> E;
cout << f(S, E)-1 << '\n';
}
return 0;
}
<알고리즘>
- {S, E}를 보기 위해 {S+1, E-1}을 본다. {S+1, E-1}이 false라면 {S, E}도 false고, {S+1, E-1} && (S, E)가 true라면 {S, E}도 true이다.
재귀함수를 하는 것보다 배열로 해서 제일 작은 크기인 1, 2개부터 시작하면 재귀함수를 사용할 필요가 없어서 시간이 절약된다. 이렇게 푼 다른 사람의 코드가 있어서 가져왔다.
<참고 코드(풀어야 볼 수 있습니다.)>
https://www.acmicpc.net/source/35669807
로그인
www.acmicpc.net
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 12015번 가장 긴 증가하는 부분 수열 2 - 이분 탐색, 가장 긴 증가하는 부분 수열 (0) | 2022.09.28 |
---|---|
[C++] 11049번 행렬 곱셈 순서 - DP (0) | 2022.09.28 |
[C++] 9466번 텀 프로젝트 - DFS, 위상 정렬, union-find (0) | 2022.09.28 |
[C++] 9328번 열쇠 - BFS (0) | 2022.09.28 |
[C++] 9252번 LCS 2 - DP (0) | 2022.09.27 |
Comments