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
- GCD
- Eulerian circuit
- mathematics
- Segment Tree
- dynamic programming
- BFSDFS
- 백준
- Euler circuit
- Algospot
- Shortest path
- flows
- DynamicProgramming
- CS Academy
- Greedy
- hashing
- disjoint-set
- scc
- Eulerian path
- Cycle detecting
- backtracking
- POJ
- BOJ
- graph
- BST
- bitmask
- implementation
- Euler path
- Dag
- Sieve_of_Eratosthenes
- graph modeling
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 15487 A[j]-A[i]+A[l]-A[k] 본문
BOJ 15487 A[j]-A[i]+A[l]-A[k]
[분류 : 다이나믹 프로그래밍]
[풀이]
A[j] - A[i]를 먼저 계산해보자. 고정된 j에 대해 A[j]-A[i]가 최대가 되기 위해선 A[i]가 최소이어야 한다. 따라서 j를 순회하면서 [0, j) 구간에서 최소값을 유지하자.
나머지 A[l] - A[k]을 구간 (j, N)에서 구하면 된다. 이 부분은 거꾸로 진행하면 된다. 즉 k를 N-2부터 시작해서 2까지 감소시켜나가면서 A[l]을 최대값으로 유지하며 진행하면 된다.
이렇게 양쪽으로 최소/최대를 유지해나가며 그 중 최대값을 가져오면 AC를 받을 수 있다.
더보기
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX_N = 1e6;
int main() {
int N, A[MAX_N], i, ldp[MAX_N], rdp, mini = 1e9, maxi = -1e9, ans = -1e9;
scanf("%d", &N);
ldp[0] = rdp = -1e9;
for (i = 0; i < N; i++) {
scanf("%d", &A[i]);
if (i)
ldp[i] = max(ldp[i - 1], A[i] - mini);
mini = min(mini, A[i]);
}
maxi = A[N - 1];
for (i = N - 2; i > 1; i--) {
rdp = max(rdp, maxi - A[i]);
ans = max(ans, rdp + ldp[i - 1]);
maxi = max(maxi, A[i]);
}
printf("%d", ans);
return 0;
}
'Solved problems' 카테고리의 다른 글
BOJ 1555 소수 만들기 (0) | 2020.06.12 |
---|---|
BOJ 1955 수식 표현 (0) | 2020.06.12 |
BOJ 2313 보석 구매하기 (0) | 2020.06.11 |
BOJ 10468 숫자뽑기게임 (0) | 2020.06.09 |
BOJ 5042 나무 옮기기 (0) | 2020.06.08 |
Comments