티스토리 뷰
#include <stdio.h>
int main(void)
{
int n = 0;
scanf("%d", &n); //몇 개?
int dp[n]; //dp
int max = 0; //최댓값
for(int i = 0; i<n; i++)
{
static int tmp = 0;
scanf("%d", &tmp);
dp[i] = tmp;
if(i == 0) max = dp[i]; //처음에 입력 받는 값을 max로
else { //i 가 1 이상
if(dp[i] < tmp + dp[i-1]) //입력 받은 수가 바로 전 것의 최댓값에 더한 것보다 작을 경우
dp[i] = tmp + dp[i-1]; //dp = 입력 받은 수 + 바로 전 것의 최댓값
if(max < dp[i]) max = dp[i]; //max보다 dp가 더 크면 교체
}
}
printf("%d", max);
return 0;
}
- 풀이
연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구해야 한다.
이를 위해선, 차근차근히 하면 된다!
ex)
10
10 -4 3 1 5 6 -35 12 21 -1
(1)
input : 10
dp[0] = 10
max = 10;
(2)
input : -4
처음에 dp[1]은 -4이나, 이전의 수에서 구할 수 있는 가장 큰 합은 10 이므로, dp[1] = -4 + dp[0], dp[1] = 6이다.
max = 10;
(3)
input : 3
처음에 dp[2]은 3이나, 이전의 수에서 구할 수 있는 가장 큰 합은 6이므로, dp[2] = 6 + 3, dp[2] = 9이다.
max = 9;
...
(9)
input : 21
처음에 dp[8]은 21이나, 이전의 수에서 구할 수 있는 가장 큰 합은 12이므로, dp[8] = 12 + 21, dp[8] = 33이다.
max 은 21이였으나 (max = dp[5] = 21) dp[8]이 더 크기 때문에,
max = 33;
...
output : 33
https://www.acmicpc.net/problem/1912
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
| c언어 10986번 나머지 합 (백준) (0) | 2022.05.29 |
|---|---|
| c언어 1038번 감소하는 수 (백준) (0) | 2022.05.29 |
| c언어 1011번 Fly me to the Alpha Centauri (백준) (0) | 2022.05.17 |
| c언어 10816번 숫자카드 (2) (백준) (0) | 2022.05.11 |
| c언어 16139번 인간-컴퓨터 상호작용 (백준) (0) | 2022.05.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- DFS
- 덱
- Krustal
- 문자열
- C언어
- 백준
- 그래프
- Lazy Propagation
- BFS
- C++
- 기하학
- 누적합
- 그리디
- Segment Tree
- 누적 합
- 최소 스패닝 트리
- XOR
- 구현
- 정렬
- union
- java
- DP
- 스택
- 1835
- find
- 세그먼트 트리
- 브루트포스
- 1835번
- 오프라인 쿼리
- PASCAL
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
