| //https://www.acmicpc.net/problem/10942 | 
| #include <iostream> | 
| #include <stdio.h> | 
| using namespace std; | 
| int num[2001]; | 
| bool dp[2001][2001]; | 
| int main() | 
| { | 
| int n, m; | 
| int start, end; | 
| scanf("%d",&n); | 
| for(int i=1; i<=n; i++) scanf("%d",&num[i]); | 
| scanf("%d",&m); | 
| for(int i=1; i<=n; i++) | 
| { | 
| dp[i][i]=1; | 
| if(i!=n && num[i]==num[i+1]) dp[i][i+1]=1; | 
| } | 
| for(int i=2; i<=n; i++) // i start->end까지의 길이 | 
| { | 
| for(int j=1 ; j<=n-i; j++) | 
| { | 
| if(dp[j+1][j+i-1] && num[j]==num[j+i]) | 
| { dp[j][j+i]=1;} | 
| } | 
| } | 
| for(int i=0; i<m; i++) | 
| { | 
| scanf("%d %d",&start,&end); | 
| printf("%d\n",dp[start][end]); | 
| } | 
| } | 
*주의
dp[1][1]부터해서 행 순으로 구하면 제대로 안 구해짐
(dp[1][2],dp[1][3],dp[1][4],dp[1][5],...)
dp[1][5]를 구하기 위해서는 dp[2][4]을 먼저 구해야함
따라서 팰린드롬의 길이 순으로 구함
길이가 2인 dp값부터 구하면
dp[1][3], dp[2][4], dp[3][5], dp[4][6], ...
dp[1][4], dp[2][5], dp[3][6], dp[4][7],...
순으로 더 작은 단위부터 구할 수 있음
또 cin, cout을 사용하면 시간 초과 걸림
'알고리즘 문제 풀이 > 1DP_과제(~180615)' 카테고리의 다른 글
| 180126_1328_고층 빌딩 (0) | 2018.01.26 | 
|---|---|
| 180125_10835_카드게임 (0) | 2018.01.25 | 
| 180123_1937_욕심쟁이 판다 (0) | 2018.01.23 | 
| 180123_11057_오르막수 (0) | 2018.01.23 | 
| 180122_1977_완전제곱수 (0) | 2018.01.22 |