반응형
DP...,, DFS(?)...,,
2017년 상반기 CE/IM 2번 문제
나는 DP로 풀었다. 예전에는 못풀었는데 프로그래밍을 하다보니 실력이 늘긴 했나보다..
풀이
1. T[], P[], dp[] 배열을 사용한다.
T[] 배열은 날짜, P[] 배열은 수입금, dp[]는 당일까지 최대 수입금 을 저장한다.
2. 첫 날부터 마지막날 까지 계산하는데 계산중인 날 기준으로 이전보다 최대수입이 작으면 안된다.
dp[i] = Math.max(dp[i], max);
3. (현재 날짜 + 상담 완료) 날짜의 수입금은
(현재 날짜 + 상담 완료)날짜에 저장된 최대 수입과 와 (오늘 이전까지 최대 수입 + 오늘 버는 수입) 중 최대값을 저장한다.
dp[T[i]+i] = Math.max(dp[T[i]+i],P[i]+dp[i]);
4. 최대수입을 저장한다.
max = Math.max(max, dp[i]);
아 설명 진짜 못한다. 아무튼 코드를 보다보면 이해 할 수 있을 꺼에요....
소스
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 | import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("input.txt"))); int N = Integer.parseInt(br.readLine()); //N+10 을 해준 이유는 마지막날 + 5일일 때 배열 에러가 날 수 있으므로 넉넉히 잡아준다. int[] T = new int[N+10]; int[] P = new int[N+10]; int[] dp = new int[N+10]; int max = 0; String[] str; for (int i = 1; i <=N; i++) { str = br.readLine().split(" "); T[i] = Integer.parseInt(str[0]); P[i] = Integer.parseInt(str[1]); } //------------입력부------------// for (int i = 1; i <=N+1; i++) { //이전까지의 최대 수입을 비교해서 최대 수입을 현재에도 저장해준다. //이전에 최대수입이 났을 수 있으므로 //ex) 3,7,(5 예상) 이라고 하면 5의 값은 7로 바꿔주는게 최대수입을 얻는데 맞다. dp[i] = Math.max(dp[i], max); //이전에 저장된 최대수익 vs 이번 움직임으로 생긴 최대 수익 dp[T[i]+i] = Math.max(dp[T[i]+i],P[i]+dp[i]); //출력될 최대 수입 max = Math.max(max, dp[i]); } System.out.println(max); } } | cs |
반응형
'나는요 공부가 좋....은걸... > 알고리즈음' 카테고리의 다른 글
[BOJ] 백준 15683 - 감시 (자바) (4) | 2018.04.16 |
---|---|
[BOJ] 백준 1912 - 연속합 (자바) (0) | 2018.04.04 |
[BOJ] 백준 14500 - 테트로미노 (자바) (2) | 2018.03.19 |
[BOJ] 백준 5014 - 스타트링크 (자바) (0) | 2018.03.19 |
[BOJ] 백준 1302 - 베스트셀러 (자바) (0) | 2018.02.20 |