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 |
Tags
- Rxjava
- Kotlin
- activity
- 암호학
- pandas
- 코드포스
- Python
- MiTweet
- textfield
- relay
- Coroutine
- Gradle
- GitHub
- android
- boj
- livedata
- ProGuard
- AWS
- Codeforces
- Hilt
- TEST
- androidStudio
- Compose
- 프로그래머스
- MyVoca
- Coroutines
- 백준
- architecture
- 코루틴
- 쿠링
Archives
- Today
- Total
이동식 저장소
706C. Hard problem 본문
보통 제목은 반대인 경우가 많다.
문자열을 사전 순으로 정렬하는 문제인데, 특이하게도 문자열의 순서를 바꿀 수 없다는 제한이 있다. 대신 문자열을 앞뒤로 뒤집는 연산만 가능하다. 또, 뒤집는 비용도 문자열마다 모두 다르다. 이제 문자열을 정렬하는 데 드는 최소 비용을 계산해 보자.
문제에서 사전 순서대로 정렬하라고 했으므로, 앞에서부터 오름차순으로 정렬해야 한다.
$cur$번 문자열을 뒤집는 상태가 $s$일 때, $cur$부터 끝까지 정렬하는 데 드는 최소 비용을 $dp(cur,~s)$라고 하자. $cur$번 문자열을 뒤집는다면 $s=1$이고, 뒤집지 않는다면 $s=0$이다.
$cur$번 문자열에서 드는 비용을 $cur\_cost$라고 하면 $cur\_cost=\begin{cases}cost[cur] & (s = 1)\\0 & (s = 0)\end{cases}$이다. 이제 $cur+1$번 문자열을 뒤집거나 뒤집지 않았을 때 사전 순으로 정렬이 가능한지 확인하고, 정렬이 가능하다면 해당 경우의 값을 재귀적으로 얻어오면 된다.
식으로 나타내면 다음과 같다.
$dp(cur,~s)=\begin{cases} {\min(dp(cur+1,~0),~dp(cur+1,~1))+cur\_cost}& (s = 1)\\{\min(dp(cur+1,~0),~dp(cur+1,~1))} & (s=0)\end{cases}$
단, 정렬이 되는지 먼저 확인한 후에 재귀를 호출해야 한다.
한번에 맞힘 히히
'Problem Solving > Codeforces' 카테고리의 다른 글
455A. Boredom (0) | 2023.04.02 |
---|---|
327A. Flipping Game (0) | 2023.03.31 |
Codeforces Round #677 (Div. 3) 참가 후기 (0) | 2020.10.21 |
Codeforces Round #661 (Div. 3) 참가 후기 (0) | 2020.08.06 |
Codeforces Round #656 (Div. 3) 가상 참가 후기 (0) | 2020.07.31 |
Comments