본문 바로가기
최대점수 구하기(냅색) N개의 문제를 풀려고 합니다.각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.) 첫 번째 줄에 문제의 개수와 제한 시간이 주어집니다. 두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다. 첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력 입력 5 20 10 5 25 12 15 8 6 3 7 4 출력 41 dp로 문제를 풀때 넣을수 있는 물건의 갯수가 정해져 있으면 뒤에서 부터 시작한다, 9/11 클래스가 없이 2차원 배열을 사용하는 방법으로 다시 풀어보자 import j.. 2023. 9. 11.
동전교환(냅색) dp 문제는 경우를 쪼개서 보는게 중요한 것 같다.. 냅색 알고리즘을 이용해서 푼다 M원을 거슬러 줘야할때 1~M까지 인덱스의 dy배열을 만들어서 최대값으로 초기화한 후 dy[0] = 0(0원 거슬러주는 방법은 0)으로 하고 tmp = dy[j - coin[i]] +1 2023. 9. 10.
가장 높은 탑 쌓기(LIS) 밑면이 정사각형인 직육면체 벽돌들을 사용하여 탑을 쌓고자 한다. 탑은 벽돌을 한 개씩 아래에서 위로 쌓으면서 만들어 간다. 아래의 조건을 만족하면서 가장 높은 탑을 쌓을 수 있는 프로그램을 작성하시오. (조건1) 벽돌은 회전시킬 수 없다. 즉, 옆면을 밑면으로 사용할 수 없다. (조건2) 밑면의 넓이가 같은 벽돌은 없으며, 또한 무게가 같은 벽돌도 없다. (조건3) 벽돌들의 높이는 같을 수도 있다. (조건4) 탑을 쌓을 때 밑면이 좁은 벽돌 위에 밑면이 넓은 벽돌은 놓을 수 없다. (조건5) 무게가 무거운 벽돌을 무게가 가벼운 벽돌 위에 놓을 수 없다. 입력 5 25 3 4 4 4 6 9 2 3 16 2 5 1 5 2 출력 10 최대 부분 증가수열을 응용한 문제, 무게와 넓이 중 하나를 잡아서 내림차순으.. 2023. 9. 9.
최대 부분 증가수열(LIS) !다시 풀어보기 N개의 자연수로 이루어진 수열이 주어졌을 때, 그 중에서 가장 길게 증가하는(작은 수에서 큰 수로) 원소들의 집합을 찾는 프로그램을 작성하라. 예를 들어, 원소가 2, 7, 5, 8, 6, 4, 7, 12, 3 이면 가장 길게 증가하도록 원소들을 차례대로 뽑아내면 2, 5, 6, 7, 12를 뽑아내어 길이가 5인 최대 부분 증가수열을 만들 수 있다. 입력 8 5 3 7 8 6 2 9 4 출력 4 부분증가수열, 원소들의 숫자는 유지해야함 dy[i] = 마지막 숫자를 arr[i]로 하는 부분증가수열의 최대 길이 arr[0]의 dy[i]는 맨 앞이므로 1, 그 뒤에 원소들은 arr[i] 앞 인덱스의 원소들을 반복문으로 돌면서 앞에 원소가 arr[i] 보다 작고, dy[앞에원소]가 0보다 크면 .. 2023. 9. 9.
계단 오르기, 돌다리 건너기 DP : 1차원 배열인 다이나믹 테이블을 이용해서 점화식 형태로 나오는 문제의 값을 구한다 계단을 오를 때 한 번에 한 계단 또는 두 계단씩 올라간다. 만약 총 4계단을 오른다면 그 방법의 수는 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2 로 5가지이다. 그렇다면 총 N계단일 때 올라갈 수 있는 방법의 수는 몇 가지인가? 계단을 오르는 방법을 저장하면서 푸는 문제 1번 계단 1가지, 2번 계단 2가지, 3번 계단 3가지... d[n] = d[n-1] + d[n-2] 형태 import java.util.*; class Main{ static int[] dy; public int Solution(int n){ dy[1] = 1; dy[2] = 2; for (int i = 3; i 2023. 9. 9.