Henu
개발냥발
Henu
전체 방문자
오늘
어제
  • 분류 전체보기 (411)
    • DevOps (52)
      • Kubernetes (19)
      • Docker (14)
      • AWS (3)
      • Nginx (4)
      • Linux (4)
      • ArgoCD (1)
      • CN (2)
      • NATS (0)
      • Git (5)
    • Back-End (30)
      • Django (18)
      • Spring (5)
      • JPA (1)
      • MSA (5)
    • CS (87)
      • SystemSoftware (20)
      • OS (25)
      • Computer Architecture (16)
      • Network (23)
      • Database (2)
    • Lang (21)
      • Java (9)
      • Python (4)
      • C# (8)
    • Life (12)
    • 블록체인 (2)
    • Algorithm (204)
      • BOJ (160)
      • 프로그래머스 (19)
      • LeetCode (4)
      • SWEA (1)
      • 알고리즘 문제 해결 전략 (8)
      • DS, algorithms (7)
      • Checkio (5)
    • IT (2)

블로그 메뉴

  • GitHub
  • 글쓰기
  • 관리자

공지사항

  • Free!

인기 글

태그

  • docker
  • BFS
  • django
  • Network
  • Kubernetes
  • DFS
  • 백트래킹
  • 다이나믹 프로그래밍
  • boj
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Henu

개발냥발

[백준 20181] 꿈틀꿈틀 호석 애벌레 - 효율성 C++
Algorithm/BOJ

[백준 20181] 꿈틀꿈틀 호석 애벌레 - 효율성 C++

2021. 6. 23. 19:31
 

20181번: 꿈틀꿈틀 호석 애벌레 - 효율성

꿈틀꿈틀 호석 애벌레는 N 개의 먹이가 일렬로 나열된 나뭇가지를 오른쪽으로 기어가려고 한다. 시작하는 순간의 호석 애벌레가 0의 위치에 있고 i 번째 먹이는 오른쪽으로 i 초 기어가야 도달할

www.acmicpc.net

다이나믹 프로그래밍, 투 포인터

 

코딩꿈나무 조정현 : 네이버 블로그

빠르게 꾸준히

blog.naver.com

정현님의 추천문제를 풀어보았다!


1. 문제 해결 아이디어

 

 

[백준 1644] 소수의 연속합 C++

1644번: 소수의 연속합 첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 4,000,000) www.acmicpc.net 수학, 두 포인터, 정수론 1. 문제풀이 아이디어 에라토스테네스의 체를 이용해서 N까지의 소수를 배열에 순서

hyeo-noo.tistory.com

이때 풀었던 투 포인터 방법을 떠올려서 풀었다

 

기본동작 : st와 ed사이의 값의 합이 K(최소 만족도)보다 클 때까지 ed를 1씩 증가시킨다.

-> ed까지의 최대 에너지는 DP[ed] = max(DP[ed], DP[ed-1]) 코드를 통해서 항상 최댓값을 유지한다.

 

사이 합이 K이상인 경우 : st를 1씩 증가시킨다.

-> DP[ed] = max(DP[ed], DP[st-1] + temp_sum - K) 코드를 통해서

(st이전까지의 최댓값 + 새롭게 얻은 탈피 에너지)와 현재 최대 탈피 에너지를 비교한 후 최댓값으로 갱신한다.

 

st==ed인데 사이합이 K보다 큰 경우 : st와 ed를 1씩 증가시킨다.


2. 코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
 
using namespace std;
 
int N, K;
long long feed[100001], DP[100001]; // dp[i] = i까지 먹이를 먹은경우 최대 축적 E
 
void input(){
    cin >> N >> K;
    for(int i = 1; i <= N; i++){
        cin >> feed[i];
    }
}
void solve(){
    int st = 1, ed = 1;
    long long temp_sum = feed[st];
    
    while(st <= N && ed <= N){
        // DP갱신
        DP[ed] = max(DP[ed], DP[ed-1]);
        
        // 누적 합이 최소 만족도 이상인 경우
        if(temp_sum >= K){
            DP[ed] = max(DP[ed], DP[st-1] + temp_sum - K);
            if(st < ed){
                temp_sum -= feed[st];
                st++;
            }
            else if(st == ed){
                st++;
                ed++;
                temp_sum = feed[ed];
            }
        }
        else{
            ed++;
            temp_sum += feed[ed];
        }
    }
    
    cout << DP[N];
}
 
int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    input();
    solve();
    return 0;
}
Colored by Color Scripter
cs

 

'Algorithm > BOJ' 카테고리의 다른 글

[백준 1688] 지민이의 테러 C++  (0) 2021.06.27
[백준 16197] 두 동전 C++  (0) 2021.06.26
[백준 1199] 오일러 회로 C++  (0) 2021.06.23
[백준 2162] 선분 그룹 C++  (0) 2021.06.20
[백준 1405] 미친 로봇 C++  (0) 2021.06.15
    'Algorithm/BOJ' 카테고리의 다른 글
    • [백준 1688] 지민이의 테러 C++
    • [백준 16197] 두 동전 C++
    • [백준 1199] 오일러 회로 C++
    • [백준 2162] 선분 그룹 C++

    티스토리툴바