(+ 추가) N의 크기는 2000 이므로 N^2은 4,000,000 입니다. dp배열은 N * N 이므로 해당 값들을 저장하고 사용하는 것은 홍준이가 질문할 때 마다 그 값이 팰린드롬인지 계산하는 시간복잡도인(2000 x 1,000,000) 보다 훨씬 빠릅니다.
2021/03/13
17860 KB
212 ms
#include <iostream>
#include <vector>
#define endl "\\n"
int N, M, S, E;
std::vector<int> board;
std::vector<std::vector<int> > dp;
void input_faster()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
}
void input()
{
input_faster();
std::cin >> N;
board.resize(N + 1);
dp.resize(N + 1, std::vector<int>(N + 1, -1));
for (size_t i = 1 ; i <= N ; i++)
std::cin >> board[i];
std::cin >> S;
}
bool dfs(int x, int y)
{
if (board[x] != board[y] || !dp[x][y])
dp[x][y] = 0;
else if (dp[x][y] == 1)
return (dp[x][y]);
else if (x >= y - 1)
dp[x][y] = 1
else
dp[x][y] = dfs(x + 1, y - 1);
return (dp[x][y]);
}
void solve()
{
int a, b;
while (S--)
{
std::cin >> a >> b;
if (dp[a][b] == -1)
dfs(a, b);
std::cout << dp[a][b] << endl;
}
}
int main()
{
input();
solve();
return (0);
}