일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 강좌
- 슬픔
- 프로그래밍
- 자작시
- python 강좌
- 2020
- 라즈베리파이3
- 라즈베리파이
- 공부
- 알고리즘
- python 강의
- 철학
- python
- BOJ
- C++
- dynamic programming
- 다이나믹프로그래밍
- 파이썬 강좌
- it
- mmcv
- 머신러닝
- 백준
- 강의
- 파이썬
- 라즈베리파이 모니터
- 파이썬 강의
- 계획
- 2021
- mmdetection
- dp
Archives
- Today
- Total
Stargazer
[백준(BOJ)] 10942번 : 팰린드롬? C++ 풀이(DP) 본문
Undergraudate basics(학부생 기초)/자료구조, 알고리즘
[백준(BOJ)] 10942번 : 팰린드롬? C++ 풀이(DP)
COM2IT 2022. 8. 2. 14:35반응형
문제:
접근:
그냥 하나씩 접근해서 비교하여 푸는 방식으로 하면, 시간내로 풀지 못한다.
따라서 점화식을 이용해서 풀면 된다.
즉, DP로 풀면 시간내로 풀린다.
전략:
시간을 최소로 사용해야하기 때문에 데이터를 메모라이징하여서 저장한다.
점화식은 구간 [i,j] 가 있을때, i==j(구간길이 1)이면 true, 구간길이가 2일때, 입력데이터 input[i] == input[j] 가 같으면 true 아니면 false로 저장하고, 나머지 구간은 dp[i,j] = dp[i+1, j-1] && input[i] == input[j] 이면 된다.
(이전 데이터를 이용해서, 양옆 한번만 비교하면 된다.)
코드:
#include <iostream>
#include <vector>
using namespace std;
int n,m;
vector<int> su;
bool dp[2001][2001];
void make(){
for(int i=0;i<=n;i++){
for(int j=0;j <= n-i;j++){
int row = j;
int col = i + j;
if(row == col) dp[row][col] = true;
else if(row + 1 > col - 1){
if(su[row] == su[col]) dp[row][col] = true;
}else{
dp[row][col] = dp[row+1][col-1] && (su[row] == su[col]);
}
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n;su.resize(n+1);
for(int i=1;i<=n;i++){
cin >> su[i];
}
make();
cin >> m;
for(int i=0;i<m;i++){
int start, end;
cin >> start >> end;
cout << dp[start][end] << '\n';
}
return 0;
}
반응형
'Undergraudate basics(학부생 기초) > 자료구조, 알고리즘' 카테고리의 다른 글
[백준(BOJ)] 2623번 : 음악 프로그램 C++ 풀이(위상정렬) (0) | 2022.07.31 |
---|---|
[백준(BOJ)] 12100번 : 2048(Easy) C++ 풀이(시뮬레이션, DFS) (0) | 2022.07.14 |
[백준(BOJ)] 11049번 : 행렬 곱셈 순서 C++ 풀이(DP) (0) | 2022.07.14 |
[백준(BOJ)] 12015번 : 가장 긴 증가하는 부분 수열 C++ 풀이 (이분 탐색) (0) | 2022.07.13 |
[백준] 9328번 : 열쇠 c++ 풀이(BFS) (0) | 2022.07.12 |
Comments