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
- Sieve_of_Eratosthenes
- POJ
- Cycle detecting
- GCD
- backtracking
- Euler circuit
- mathematics
- Euler path
- Eulerian path
- Shortest path
- CS Academy
- scc
- graph modeling
- Algospot
- hashing
- dynamic programming
- 백준
- disjoint-set
- BFSDFS
- Eulerian circuit
- BOJ
- graph
- flows
- bitmask
- implementation
- Dag
- Greedy
- Segment Tree
- DynamicProgramming
- BST
Archives
- Today
- Total
그냥 하는 노트와 메모장
BOJ 2313 보석 구매하기 본문
BOJ 2313 보석 구매하기
[분류 : 다이나믹 프로그래밍]
연속 부분 수열의 합을 최대로 하는 방식을 여러 차례 반복해서 진행하면 되는 문제.
[주의해야 할 점]
- 정답은 32비트 int 자료형에 들어가지 않을 수 있다. 오버플로우에 유의하자.
- 구간의 길이가 짧아야한다. 0인 요소에 대해 처리할 필요가 있다. 가령 "0 0 0 1 0"이 입력으로 들어오면 [1, 4]가 아니라 [4, 4]가 정답 구간이다.
더보기
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, L, sum, asum, i, l, r, d, al, ar;
long long ans = 0;
vector<pair<int, int>> seg;
scanf("%d", &n);
while (n--) {
scanf("%d", &L);
asum = sum = -1e9;
al = ar = l = r = 0;
for (i = 0; i < L; i++) {
scanf("%d", &d);
if (sum < 0) {
sum = d;
l = r = i;
}
else {
if(sum) r++;
else l = r = i;
sum += d;
}
if (asum < sum || (asum == sum && r - l < ar - al)) {
asum = sum;
al = l, ar = r;
}
}
seg.push_back({ al, ar });
ans += asum;
}
printf("%lld\n", ans);
for (auto& u : seg)
printf("%d %d\n", u.first + 1, u.second + 1);
return 0;
}
'Solved problems' 카테고리의 다른 글
BOJ 1955 수식 표현 (0) | 2020.06.12 |
---|---|
BOJ 15487 A[j]-A[i]+A[l]-A[k] (0) | 2020.06.11 |
BOJ 10468 숫자뽑기게임 (0) | 2020.06.09 |
BOJ 5042 나무 옮기기 (0) | 2020.06.08 |
BOJ 12932 노래방 (0) | 2020.06.08 |
Comments