BOJ에서 다음 문제들을 쭉 순서대로 풀어본다. boj.kr/문제번호 <= 형태로 검색하면 된다.
DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052
1시간 넘어가면 풀던 짓을 그만두고 반드시 AC받은 코드 찾아보기 (설명이 꼭 달려있는 코드를 읽자)
그리고 푼 다음에는 반드시 다른 사람의 코드를 봐야 한다.
특히 자신만의 가상의 스승을 잡고 그 분의 코드를 보는 것도 좋은 방법이라 생각한다.
너무 갓갓들은 이상한 방식으로도 짜는 경우도 있기 때문에 적당한 사람을 선택해야 한다.
내가 애용하는 IDE 사이트
(IDE 자동 완성이 불가능하기 때문에 사용하는 중)
접근 방법
더보기
첫 번째 코드
: if(dp[i - 1] + arr[i] > dp[i]) 이렇게 비교해놓고, 엥 왜 틀렸지? 이러고 있었다..ㅎ
#include <iostream>
using namespace std;
int arr[100001], dp[100001];
int main() {
int n, max;
cin >> n;
for(int i = 0; i < n; i++){
cin >> arr[i];
}
dp[0] = max = arr[0];
for(int i = 1; i <= n; i++){
if(dp[i - 1] + arr[i] > dp[i]){
dp[i] = dp[i - 1] + arr[i];
}else{
dp[i] = arr[i];
}
}
for(int i = 0; i < n; i++){
if(max < dp[i]){
max = dp[i];
}
//cout << dp[i] << " ";
}
//cout << endl;
cout << max;
return 0;
}
두 번째 코드 :
주석부분을 제외하고 다시 제출 후, 정답.
#include <iostream>
using namespace std;
int arr[100001], dp[100001];
int main() {
int n, max;
cin >> n;
//for(int i = 0; i < n; i++){
for(int i = 1; i <= n; i++){
cin >> arr[i];
}
max = arr[1];
//for(int i = 1; i <= n; i++){
for(int i = 1; i <= n; i++){
if(dp[i - 1] + arr[i] > arr[i]){
dp[i] = dp[i - 1] + arr[i];
}else{
dp[i] = arr[i];
}
}
for(int i = 1; i <= n; i++){
if(max < dp[i]){
max = dp[i];
}
}
cout << max;
return 0;
}
정답 코드
#include <iostream>
using namespace std;
int arr[100001], dp[100001];
int main() {
int n, max;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
}
max = arr[1];
for(int i = 1; i <= n; i++){
if(dp[i - 1] + arr[i] > arr[i]){
dp[i] = dp[i - 1] + arr[i];
}else{
dp[i] = arr[i];
}
}
for(int i = 1; i <= n; i++){
if(max < dp[i]){
max = dp[i];
}
}
cout << max;
return 0;
}
참고한 블로그
'OLD_알고리즘 > Baekjoon' 카테고리의 다른 글
백준] 1699 : 제곱수의 합 (0) | 2020.10.11 |
---|---|
백준] 2579 : 계단 오르기 (0) | 2020.10.07 |
백준] 11054 : 가장 긴 바이토닉 부분 수열 (0) | 2020.09.24 |
백준] 11722 : 가장 긴 감소하는 부분 수열 (0) | 2020.09.24 |
백준] 11055 : 가장 큰 증가 부분 수열 (0) | 2020.09.23 |
댓글