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
- Rxjava
- GitHub
- Coroutines
- 프로그래머스
- TEST
- ProGuard
- activity
- Hilt
- android
- pandas
- Compose
- Kotlin
- 암호학
- 코드포스
- MiTweet
- boj
- Coroutine
- MyVoca
- Codeforces
- 쿠링
- AWS
- architecture
- textfield
- 백준
- androidStudio
- 코루틴
- Python
- relay
- livedata
- Gradle
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