Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 백준알고리즘
- 두원사이의정수쌍
- 5강클로저
- 백준 알고리즘
- c++
- 스택
- solved.ac플래티넘
- 2023카카오블라인드코테
- [pccp 기출문제]
- solved.ac골드
- 우박수열정적분
- 과제진행하기
- React.StrictMode
- pccp기출문제
- 프로그래머스
- Lv2
- JS
- 알고리즘 문제풀이
- 타겟넘버
- div2개
- DP
- 코어자바스크립트
- JS스터디
- 정렬
- 이중지도
- 비트마스크
- Lv3
- 알고리즘문제풀이
- 지도 여러개
- 최소스패닝트리
Archives
- Today
- Total
호지
[백준 알고리즘] 1509번 팰린드롬 분할 c++ 본문
문제를 보자마자 dp를 적용해서 풀어야겠다고 느꼈으나
아직 dp로 푸는건 너무 오래걸리는 것 같다. 분발하자.
dp 테이블의 [i ,j]의 원소 값은 i에서 j까지 분할을 했을 때
펠린드롬 분할이 가능하면 true, 불가능하면 false이다.
(따라서 테이블에서 i<=j인 부분만 사용)
dp테이블을 순차적으로 채우는 과정은 다음과 같다.
1. i=j일때 dp테이블은 true (길이가 1이면 펠린드롬)
2. i+1=j일때 s[i] = s[j]이면 dp테이블은 true (길이가 2일때 두 원소가 같으면 펠린드롬)
3. 길이가 2~문자열길이(n)일때 순차적으로 탐색했을 때,
j = i+n일때 s[i] = s[j]이면서 dp[i+1][j-1]이 true면
dp[i][j]는 true
ex) ABBA라는 문자열에서 2번 과정으로 i=1, j=2일때 dp가 true이고
i=0, j=3일때 s[0]과 s[3]은 A로 값이 동일하고 dp[1][2]도 true이므로
dp[0][3]도 true이다
dp테이블을 모두 채운 후,
각 길이에서 최소의 팰린드롬 분할의 수를 저장하는 d배열을 순차적으로 채우면
원하는 결과를 d[문자열길이]에 얻을 수 있다.
d배열은 dp테이블을 순차적으로 탐색하여 과
d[j] +1 와 dp[i][j]가 true일 때 d[i]+1들 중 최소를 d[i]로 한다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
bool dp[2501][2501];
int main(){
string s;
cin >> s;
for(int i=0; i<s.size(); i++){
dp[i][i] = true;
}
for(int i=0; i<s.size()-1; i++){
if(s[i] == s[i+1])
dp[i][i+1] = true;
}
for(int n = 2; n < s.size(); n++){
for(int i=0; i< s.size()-n; i++){
int j=i+n;
if(s[i] == s[j] && dp[i+1][j-1]){
dp[i][j] = true;
}
}
}
int d[2501];
d[0] = 0;
for(int n=1; n<=s.size(); n++){
int j = n-1;
d[n] = d[j] + 1;
for(int i=0; i<n-1; i++){
if(dp[i][j]){
if(d[n] > d[i] + 1)
d[n] = d[i] +1;
}
}
}
cout << d[s.size()] << endl;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘] 1644번 소수의 연속 합 (0) | 2022.05.01 |
---|---|
[백준 알고리즘] 1562번 계단 수 c++ (0) | 2022.04.30 |
[백준 알고리즘] 1208번 부분 수열의 합2 문제풀이 c++ (0) | 2022.04.21 |
[백준 알고리즘] 1202번 보석 도둑 문제풀이 c++ (0) | 2022.04.20 |
[백준 알고리즘] 1197번 최소 스패닝 트리 문제풀이 c++ (0) | 2022.04.16 |
Comments