일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 장고
- 알고리즘 연습
- js
- API
- 파이썬 알고리즘
- web
- 알고리즘
- 알고리즘 문제
- DRF
- react
- MAC
- 파이썬
- Django
- c++
- javascript
- Algorithm
- CSS
- Git
- 알고리즘 풀이
- PYTHON
- django widget
- 백준
- django ORM
- java
- HTML
- form
- es6
- django rest framework
- AWS
- Baekjoon
Archives
- Today
- Total
수학과의 좌충우돌 프로그래밍
[C++] BAEKJOON 1509 팰린드롬 분할 본문
https://www.acmicpc.net/problem/1509
지난 포스팅에서는 팰린드롬인지 아닌지 판별하는 문제를 동적계획법을 이용해서 해결해보았습니다.
이번 문제는 이를 응용하여 해결할 수 있습니다. 동적계획법을 통해 dp[i]][j]
(=i번째부터 j번째 까지의 문자열이 팰린드롬인지) 를 정의하고 이를 통해 문제를 해결합니다. count[i]
( i 번째 까지 문자열에 대해 팰린드롬 분할의 개수의 최솟값) 에 값을 저장합니다. i 를 기준으로 j 를 1부터 i 까지 순회하며 j~i 의 문자열이 팰린드롬을 이룬다면 이것으로 자르는게 최소 분할이 될지를 검사해줍니다. 그러기 위해 count
배열에는 큰 수로 초기화 시켜놨습니다.
#include <iostream>
#include <string>
using namespace std;
bool dp[2501][2501];
int main() {
int count[2501];
string s;
cin >> s;
int n = s.size();
s = " " + s;
for (int i=1; i<=n; i++) {
dp[i][i] = true;
}
for (int i=1; i<=n-1; i++) {
if (s[i] == s[i+1]) {
dp[i][i+1] = true;
}
}
for (int k=2; k<n; k++) {
for (int i=1; i<=n-k; i++) {
int j = i+k;
if (s[i] == s[j] && dp[i+1][j-1]){
dp[i][j] = 1;
}
}
}
count[0] = 0;
for (int i=1; i<=n; i++) {
count[i] = 987654321;
for (int j=1; j<=i; j++) {
if (dp[j][i]) {
if (count[i] > count[j-1]+1) {
count[i] = count[j-1]+1;
}
}
}
}
cout << count[n] << '\n';
return 0;
}
'알고리즘 > C++' 카테고리의 다른 글
[C++] BAEKJOON 2293 동전 1 (0) | 2019.09.06 |
---|---|
[C++] BAEKJOON 2156 포도주 시식 (0) | 2019.09.06 |
[C++] BAEKJOON 10942 팰린드롬? (0) | 2019.09.06 |
[C++] BAEKJOON 1890번 점프 (0) | 2019.09.06 |
[C++] BAEKJOON 5052번 전화번호목록 (0) | 2019.08.26 |
Comments