| //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 |