본문 바로가기

다이나믹프로그래밍5

[백준] 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.
[백준] 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.