-
[KOITP] 롤러코스터자료구조 및 알고리즘/문제풀이 2017. 1. 9. 19:10
출 처 : http://koitp.org/problem/USACO_2006DEC_ROLLERCOASTER/read/
시간 제한 메모리 제한 제출 횟수 정답 횟수 (비율) 정답자 수 1.0 초 512 MB 2657 475 (18%) 346 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.StringTokenizer; public class RollerCoaster { public static int L = 0; // 롤러코스터의 길이 public static int N = 0; // 부품의 수 public static int B = 0; // 총 예산 public static ArrayList<Integer> xList[] = null; // 각 시작점 별 추가 가능한 부품번호 public static int W[] = null; // 각 부품의 길이 public static int F[] = null; // 각 부품의 재미도 public static int C[] = null; // 각 부품의 비용 public static int dp[][] = null; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); L = Integer.parseInt(st.nextToken()); N = Integer.parseInt(st.nextToken()); B = Integer.parseInt(st.nextToken()); dp = new int[L + 1][B + 1]; xList = new ArrayList[L + 1]; W = new int[N + 1]; F = new int[N + 1]; C = new int[N + 1]; for (int i = 0; i <= L; i++) { xList[i] = new ArrayList<Integer>(); } for (int i = 1; i <= N; i++) { st = new StringTokenizer(br.readLine()); xList[Integer.parseInt(st.nextToken())].add(i); W[i] = Integer.parseInt(st.nextToken()); F[i] = Integer.parseInt(st.nextToken()); C[i] = Integer.parseInt(st.nextToken()); } for (int i = 0; i <= L; i++) { for (int j = 0; j <= B; j++) { dp[i][j] = Integer.MIN_VALUE; } } dp[0][0] = 0; // D(i, j) = i 길이까지의 비용을 j 만큼 들였을 때의 최대 재미도 합 // D(i + W[k], j + C[k]) = D(i, j) + F[k] : k는 시작점이 i인 경우의 값 for (int i = 0; i <= L; i++) { for (int j = 0; j <= B; j++) { if (dp[i][j] > Integer.MIN_VALUE) { for (int k : xList[i]) { if (i + W[k] <= L && j + C[k] <= B && dp[i + W[k]][j + C[k]] < dp[i][j] + F[k]) { dp[i + W[k]][j + C[k]] = dp[i][j] + F[k]; } } } } } int answer = -1; for (int i = 0; i <= B; i++) { answer = Math.max(answer, dp[L][i]); } bw.write("" + answer + "\n"); bw.flush(); bw.close(); } }