번째 수부터 번째 수가 팰린드롬을 이루기 위한 조건은 다음과 같다.
번째 수와 번째 수가 같고, 번째 수부터 번째 수가 팰린드롬을 이룬다.
dp[x][y]
: 이고 일 때 번째 수부터 번째 수가 팰린드롬이라면1
, 아니라면0
이다.
- 이므로 라면 무조건
0
이고, 라면 무조건1
이다.seq[i]
를 번째 수라고 할 때,dp[x][y]
가1
이기 위해서는
seq[x] == seq[y] && dp[x+1][y-1] == 1
이어야한다.
- 양 끝이 같은 숫자이고 그 사이에 있는 수들이 팰린드롬을 이룬다면, 전체또한 팰린드롬임을 의미한다.
- 또한, 이는 이차원 평면상에서 왼쪽아래 대각선이
1
이여야함을 의미하므로,
다음 순서로dp
를 갱신해나간다.
인 경우 양 끝 사이에 존재하는 수가 없으므로
seq[x] == seq[y]
라면1
이다.
void INPUT()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> seq[i];
dp[i][i] = 1;
}
cin >> m;
}
<입력 함수>
인 구간의dp
값을1
로 초기화한다.
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j + i <= n; j++)
{
if(i == 1 && seq[j] == seq[j + i])
dp[j][j + i] = 1;
else if(seq[j] == seq[j + i] && dp[j + 1][j + i - 1] == 1)
dp[j][j + i] = 1;
else dp[j][j + i] = 0;
}
<dp 갱신>
는 와 의 간격을 의미한다. 간격을 하나씩 넓혀가며dp
를 갱신한다.
i == 1
이라면 인 구간, 즉 길이가 2인 구간이므로 두 수가 같으면1
로 갱신한다.
#include <iostream>
#include <string>
using namespace std;
int n,m;
int seq[2010];
int dp[2010][2010];
void INPUT()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> seq[i];
dp[i][i] = 1;
}
cin >> m;
}
void SOLVE()
{
for(int i = 1; i <= n - 1; i++)
for(int j = 1; j + i <= n; j++)
{
if(i == 1 && seq[j] == seq[j + i])
dp[j][j + i] = 1;
else if(seq[j] == seq[j + i] && dp[j + 1][j + i - 1] == 1)
dp[j][j + i] = 1;
else dp[j][j + i] = 0;
}
for(int i = 0; i < m; i++)
{
int s,e; cin >> s >> e;
cout << dp[s][e] << '\n';
}
}
int main()
{
INPUT();
SOLVE();
}