오늘의 알고리즘
[C++] 백준 10942 팰린드롬?
하늘하늘 .
2022. 12. 5. 20:38
#include <iostream>
int arr[2001] = {};
bool dp[2001][2001] = {};
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
int N = 0;
std::cin >> N;
for (int i = 1; i <= N; ++i)
{
std::cin >> arr[i];
}
for (int i = 1; i <= N; ++i)
{
if (arr[i] == arr[i + 1])
{
dp[i][i + 1] = true;
}
}
for (int i = 1; i <= N; ++i)
{
dp[i][i] = true;
}
for (int i = N - 1; i >= 1; --i)
{
for (int j = i + 2; j <= N; ++j)
{
if (arr[i] == arr[j] && dp[i + 1][j - 1])
{
dp[i][j] = true;
}
}
}
int M = 0;
std::cin >> M;
int start = 0;
int end = 0;
for (int i = 0; i < M; ++i)
{
std::cin >> start >> end;
std::cout << dp[start][end] << "\n";
}
return 0;
}
dp[i][j]은 i열에서 j열까지의 팰린드롬입니다.
바로 옆이라면 2개라도 팰린드롬이 되기 때문에 i, i+1이 똑같을 경우 그 옆도 true로 해줍니다.
이후 본인만 나와도 true이기 때문에 다 i, i는 true로 했습니다.
이후부터는 [i+1][j-1] 두개가 똑같고 그 전까지 모두 다 팰린드롬이 된다고 한다면 dp[i][j]도 됩니다.
그렇게 쭉 계산합니다.