https://www.acmicpc.net/problem/1912
시간 제한 | 2 초 |
메모리 제한 | 128 MB |
제출 | 51339 |
정답 | 14220 |
맞은 사람 | 9806 |
정답 비율 | 27.120% |
문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
입력
첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.
기존 코드
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 | #include <iostream> #include <algorithm> int dp[100010]; int arr[100010]; int max(int first, int second) { return first > second ? first : second; } int main() { int n = 0; std::cin >> n; for (int i = 0; i < n; ++i) { std::cin >> arr[i]; dp[i] = -1001; } dp[0] = arr[0]; for (int i = 1; i < n; ++i) { dp[i] = max(arr[i], arr[i] + dp[i - 1]); } std::sort(dp, dp + n); std::cout << dp[n - 1]; return 0; } | cs |
시간 20ms
바꾼 코드
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 | #include <iostream> #include <algorithm> int dp[100010]; int arr[100010]; int max(int first, int second) { return first > second ? first : second; } int main() { std::cin.tie(0); std::cin.sync_with_stdio(false); std::cout.tie(0); std::cout.sync_with_stdio(false); int n = 0; std::cin >> n; dp[0] = -1001; for (int i = 1; i <= n; ++i) { std::cin >> arr[i]; dp[i] = -1001; dp[i] = max(arr[i], arr[i] + dp[i - 1]); } std::sort(dp, dp + n + 1); std::cout << dp[n]; return 0; } | cs |
시간 8ms
어이어이 너무 쉬운거 아니냐고 wwwwwww
LIS LCS에서 뚝배기터지고 나온 문제라 와 시발 얼마나 어려울까 해쓴ㄴ데
문제가 생각보다 너무 쉬울것같아서 아.. 뭔가 어려운게 있겠지? 있겠지? 해서
(코드 짠시간보다 이게 될까 안될까 고민하는 시간이 더 길었다)
부들부들 떨면서 제출했는데 그냥 통과대버렷다
쉬운문제는 맞는것같은데 왤캐 정답률이 낮지
히히ㅣㅎ킿킿ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ
'알고리즘' 카테고리의 다른 글
1. 희망의 나라로 알고리즘 (0) | 2019.10.07 |
---|---|
백준 11066: 파일 합치기(DP) (0) | 2019.09.06 |
백준 9251: LCS(DP) (0) | 2019.08.26 |
백준 2565: 전깃줄(DP) (0) | 2019.08.23 |
백준 11054: 가장 긴 바이토닉 부분 수열(DP) (0) | 2019.08.23 |