본문 바로가기

DP7

[백준] 11660 구간 합 구하기 5 (Java) [11660 구간 합 구하기 5] 난이도: 실버1 11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 문제 입력 출력 [아이디어] DP를 사용하여 구하면 된다. D[x1][y1] = (1, 1)부터 (x1, y1)까지의 누적 합을 나타낸다. 보라색 부분을 구하기 위해서는 D[3][4] - D[2][4] - D[3][1] + D[2][1] 을 구하면 되다. D[2][1]을 다시 더해주는 이유는 그 부분이 두번 빠지기 때문이다. [JAVA 코드] import java.io.*.. 2022. 6. 23.
[백준] 15681 트리와 쿼리 (Java) [15681 트리와 쿼리] 난이도: 골드5 15681번: 트리와 쿼리 트리의 정점의 수 N과 루트의 번호 R, 쿼리의 수 Q가 주어진다. (2 ≤ N ≤ 105, 1 ≤ R ≤ N, 1 ≤ Q ≤ 105) 이어 N-1줄에 걸쳐, U V의 형태로 트리에 속한 간선의 정보가 주어진다. (1 ≤ U, V ≤ N, U ≠ V) www.acmicpc.net 문제 입력 출력 [아이디어] 처음에는 트리를 생성해준 뒤 쿼리 개수만큼 정점의 수를 구했는데, 시간 초과가 났다. 그래서 문제 아래 있는 힌트대로 정점의 개수를 구하는 함수를 구현해주었다. [JAVA 코드] import java.io.*; import java.util.*; public class Main { static BufferedReader br = n.. 2022. 5. 20.
[백준] 1520 내리막 길 (Java) [1520 내리막 길] 난이도: 골드4 1520번: 내리막 길 첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. www.acmicpc.net 문제 입력 출력 [아이디어] 처음에는 일반 DFS로 풀었다가 시간 초과가 났다. (다시 생각해보니 대략 500 * 500 * 500 * 500 * 4 정도의 시간이 걸리므로 시간 초과가 나는 것은 당연했다.) 시간 초과가 났기 때문에 DP로 풀어야 하나는 것은 알아챘지만 어떻게 DP를 적용해야 하는지 모르겠어서 구글링을 해봤다. 이 분이 설명을 위해 만들어 놓은 애니메이션으로 접근 방법을 알아 차릴 수 있었다. [백준][.. 2022. 4. 4.
[백준] 14002 가장 긴 증가하는 부분 수열 4 (Java) [14002 가장 긴 증가하는 부분 수열 4] 난이도: 골드4 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 문제 입력 출력 [아이디어] D[i] = i번째 이전에 i번째 수보다 작은 수의 부분 수열의 길이 중 최대 길이 + 1 pre[i] = D[i]에서 찾은 최대 부분 수열의 길이를 가진 수의 인덱스 기존 가장 긴 증가하는 부분 수열과의 차이점은 부분 수열이 필요하다는 점이다. 따라서 pre 배열로 i 번째 이 전에 지나친 .. 2022. 3. 31.
[백준] 2156 포도주 시식 (Java) [2156 포도주 시식] 난이도: 실버1 2156번: 포도주 시식 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규 www.acmicpc.net 문제 입력 출력 [아이디어] 0, 1, 2번 연속해서 마시는 경우를 생각하여 2차원 배열을 잡아준다. D[i][j] = i번째 포도주가 0번째 연속해서 마시는 경우라고 생각하자. D[i][0]: i번째 음료를 마시지 않는 경우 -> i-1번째에서 가장 큰 값 가져오기 D[i][1]: i번째 음료를 1번째 연속으로 마신 경우 -> i-2번째애서 가장 큰 값 + 현재 포도주 값 D[i][2]: i번째 음료를 2번째 연속으로 마.. 2022. 3. 30.
[백준] 11727 2xn 타일링2 (Java) [11727 2xn 타일링2] 난이도: 실버3 11727번: 2×n 타일링 2 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. www.acmicpc.net 문제 입력 출력 [아이디어] 지금 문제를 풀기 전에 이 문제를 풀고 오는 것이 더 이해하기 쉽다. [백준] 11726 2xn 타일링 (Java) [11726 2xn 타일링] 난이도: 실버3 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 kyeee2.tistory.com D[i] = 2 x i 의 직사각형을 채우는 방법.. 2022. 3. 25.
[백준] 11726 2xn 타일링 (Java) [11726 2xn 타일링] 난이도: 실버3 11726번: 2×n 타일링 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. www.acmicpc.net 문제 입력 출력 [아이디어] D[i] = 2 x i 의 직사각형을 채우는 방법 이라고 정하자. 2 x 1 의 크기의 블럭을 놓은 경우 2 x (n - 1) 크기의 블럭을 채워야한다. 1 x 2 크기의 블럭은 2개를 같이 놓는 방법뿐이다. 이 때 2 x (n - 2) 크기의 블럭을 채워야한다. 따라서 D[i] = D[i-1] + D[i-2] 의 점화식이 나온다. [JAVA 코드] import java.io.BufferedReader; impo.. 2022. 3. 25.