
목차
1912번: 연속합
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
www.acmicpc.net
코드
#include <iostream>
using namespace std;
int n;
int arr[100000];
int dp[100000];
void init(){
cin >> n;
for(int i=0; i<n; i++){
cin >> arr[i];
}
}
void solve(){
dp[0] = arr[0];
int max_num = dp[0];
for(int i=1; i<n; i++){
dp[i] = dp[i-1] + arr[i] > arr[i] ? dp[i-1] + arr[i] : arr[i];
max_num = dp[i] > max_num ? dp[i] : max_num;
}
cout << max_num;
}
int main() {
init();
solve();
}
풀이
DP[i] = max(DP[i-1] + arr[i], arr[i])
위 점화식을 토대로 풀면 바로 풀리는 문제입니다.
연속되는 수 중간에 음수가 있다 하더라도 연결되어있는 다른 수가 크다면
충분히 메꿀수 있다는 것을 생각하시면 됩니다.
'공부 > 백준' 카테고리의 다른 글
백준 1075번: 나누기(C++) (0) | 2020.11.29 |
---|---|
백준 9251번: LCS(C++) (0) | 2020.11.28 |
백준 2565번: 전깃줄(C++) (0) | 2020.11.26 |
백준 11054번: 가장 긴 바이토닉 부분 수열(C++) (0) | 2020.11.25 |
백준 11053번: 가장 긴 증가하는 부분 수열(C++) (0) | 2020.11.24 |