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
- Coroutine Flow
- 백준 10819
- 1753 파이썬
- Android Room
- 1806 백준
- 자바
- 코루틴 플로우
- 백준 1644
- 백준 5582
- 10819 파이썬
- 5582 DP
- 백준 2096
- 1753 다익스트라
- git local remote
- 5582 파이썬
- flow buffering
- java
- 2096 파이썬
- 이진 탐색
- 자료구조
- 투포인터 알고리즘
- 안드로이드 hilt
- 6588 파이썬
- 1644 파이썬
- Jetpack Room
- Android mvp
- 1806 파이썬
- 1806 투포인터
- 1003 파이썬
- android hilt
Archives
- Today
- Total
Gemstone's Devlog
[Codeforces] 448C: Painting Fence 본문
이 문제는 분할 정복 알고리즘으로 접근할 수 있다.
만약 가로로 칠하는 게 있다면, 그 stroke는 제일 밑에 있어야만 한다.
결국, 제일 작은 높이까지는 가로로 다 칠해줘야 한다.
가로가 없는 경우 -> 세로만 있는 경우니깐 답은 n
가로가 있는 경우 -> 최대한 칠할 수 있을 때까지 다 가로로 칠해준다. 남은 부분은 또 다음과 같이 나눌 수 있다.
결국 divide and conquer문제!!
= 재귀로 풀 수 있다.
C++ 풀이
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int n;
int a[5001];
int solve(int x[], int size) {
int i, min_num, ans, p, q;
min_num = 1000000000;
for (i = 0; i < size; i++) {
min_num = min(min_num, x[i]);
}
for (i = 0; i < size; i++) {
x[i] -= min_num;
}
ans = min_num;
// p부터 q까지가 0이 아닌 것들. p앞은 0이거나 없거나. q다음은 0이거나 없거나
p = 0;
while(p < size) {
while(p < size && x[p] == 0) p++;
if (p == size) break;
q = p;
while (q+1 < size and x[q+1] > 0) q++;
ans += solve(x+p, q-p+1);
}
return min(size, ans);
}
int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
cout << solve(a, n);
return 0;
}
'Data Structure & Algorithms' 카테고리의 다른 글
[백준] 2133번: 타일 채우기 (다이나믹 프로그래밍) (0) | 2022.03.28 |
---|---|
[Codeforces] 768B: Code For 1 (0) | 2022.03.27 |
[백준] 1202번: 보석 도둑 (우선순위 큐) (0) | 2022.03.27 |
[백준] 1339번: 단어 수학 (그리디) (0) | 2022.03.24 |
[백준] 14889번: 스타트와 링크 (백트래킹) (0) | 2022.03.13 |