백준문제풀이
백준 문제 10942번 팰린드롬? 문제풀이 c++
노가다 김씨
2022. 3. 20. 21:25
https://www.acmicpc.net/problem/10942
10942번: 팰린드롬?
총 M개의 줄에 걸쳐 홍준이의 질문에 대한 명우의 답을 입력으로 주어진 순서에 따라서 출력한다. 팰린드롬인 경우에는 1, 아닌 경우에는 0을 출력한다.
www.acmicpc.net
문제해설
dp로 풀었는데 dp[i][j]를 i번째부터 j번재까지의 문자열이 팰린드롬이라면 1 그렇지 않으면 0 으로 정의했다.
길이가 1인경우엔 무조건 1이고 길이가 2인 경우엔 두글자가 같으면 1이다 이것은 입력을 받을 때 바로 알 수있다.
또 팰린드롬글자의 앞뒤에 같은 글자를 붙이면 그것 역시 팰린드롬이라는 특성을 이용하면 dp배열을 채워 갈수가 있다.
이 아이디어로 다음과같이 코드를 작성하였다.
코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int a[2005];
int dp[2005][2005];
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n,m,s,e;
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
for(int i=1; i<=2000; i++)
{
dp[i][i]=1;
if(a[i]==a[i+1])
{
dp[i][i+1]=1;
}
}
for(int j=1998; j>=1; j--)
{
for(int i=1; i<=j; i++)
{
if((dp[i+1][i+2000-j-1]==1)&&(a[i]==a[i+2000-j]))
{
dp[i][i+2000-j]=1;
}
}
}
cin>>m;
while(m--)
{
cin>>s>>e;
cout<<dp[s][e]<<"\n";
}
}