Skip to content

Commit

Permalink
day9: (2) dp/11054, dp/1912
Browse files Browse the repository at this point in the history
  • Loading branch information
CheolHoJung committed Apr 15, 2019
1 parent 67a144a commit c316a71
Show file tree
Hide file tree
Showing 3 changed files with 215 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ algorithm-practice
[~~2557~~](https://www.acmicpc.net/problem/2557), [~~1000~~](https://www.acmicpc.net/problem/1000), [~~2558~~](https://www.acmicpc.net/problem/2558), [~~10950~~](https://www.acmicpc.net/problem/10950), [~~10951~~](https://www.acmicpc.net/problem/10951), [~~10952~~](https://www.acmicpc.net/problem/10952), [~~10953~~](https://www.acmicpc.net/problem/10953), [~~11021~~](https://www.acmicpc.net/problem/11021), [~~11022~~](https://www.acmicpc.net/problem/11022), [~~11718~~](https://www.acmicpc.net/problem/11718), [~~11719~~](https://www.acmicpc.net/problem/11719), [~~11720~~](https://www.acmicpc.net/problem/11720), [~~11721~~](https://www.acmicpc.net/problem/11721), [~~2741~~](https://www.acmicpc.net/problem/2741), [~~2742~~](https://www.acmicpc.net/problem/2742), [~~2739~~](https://www.acmicpc.net/problem/2739), [~~1924~~](https://www.acmicpc.net/problem/1924), [~~8393~~](https://www.acmicpc.net/problem/8393), [~~10818~~](https://www.acmicpc.net/problem/10818), [~~2438~~](https://www.acmicpc.net/problem/2438), [~~2439~~](https://www.acmicpc.net/problem/2439), [~~2440~~](https://www.acmicpc.net/problem/2440), [~~2441~~](https://www.acmicpc.net/problem/2441), [~~2442~~](https://www.acmicpc.net/problem/2442), [~~2445~~](https://www.acmicpc.net/problem/2445), [~~2522~~](https://www.acmicpc.net/problem/2522), [~~2446~~](https://www.acmicpc.net/problem/2446), [~~10991~~](https://www.acmicpc.net/problem/10991), [~~10992~~](https://www.acmicpc.net/problem/10992)

### DP
[~~1463~~](https://www.acmicpc.net/problem/1463), [~~11726~~](https://www.acmicpc.net/problem/11726), [~~11727~~](https://www.acmicpc.net/problem/11727), [~~9095~~](https://www.acmicpc.net/problem/9095), [~~10844~~](https://www.acmicpc.net/problem/10844), [~~11057~~](https://www.acmicpc.net/problem/11057), [~~2193~~](https://www.acmicpc.net/problem/2193), [~~9465~~](https://www.acmicpc.net/problem/9465), [~~2156~~](https://www.acmicpc.net/problem/2156), [~~11053~~](https://www.acmicpc.net/problem/11053), [~~11055~~](https://www.acmicpc.net/problem/11055), [~~11722~~](https://www.acmicpc.net/problem/11722), [11054](https://www.acmicpc.net/problem/11054), [1912](https://www.acmicpc.net/problem/1912), [2579](https://www.acmicpc.net/problem/2579), [1699](https://www.acmicpc.net/problem/1699), [2133](https://www.acmicpc.net/problem/2133), [9461](https://www.acmicpc.net/problem/9461), [2225](https://www.acmicpc.net/problem/2225), [2011](https://www.acmicpc.net/problem/2011), [11052](https://www.acmicpc.net/problem/11052)
[~~1463~~](https://www.acmicpc.net/problem/1463), [~~11726~~](https://www.acmicpc.net/problem/11726), [~~11727~~](https://www.acmicpc.net/problem/11727), [~~9095~~](https://www.acmicpc.net/problem/9095), [~~10844~~](https://www.acmicpc.net/problem/10844), [~~11057~~](https://www.acmicpc.net/problem/11057), [~~2193~~](https://www.acmicpc.net/problem/2193), [~~9465~~](https://www.acmicpc.net/problem/9465), [~~2156~~](https://www.acmicpc.net/problem/2156), [~~11053~~](https://www.acmicpc.net/problem/11053), [~~11055~~](https://www.acmicpc.net/problem/11055), [~~11722~~](https://www.acmicpc.net/problem/11722), [~~11054~~](https://www.acmicpc.net/problem/11054), [~~1912~~](https://www.acmicpc.net/problem/1912), [2579](https://www.acmicpc.net/problem/2579), [1699](https://www.acmicpc.net/problem/1699), [2133](https://www.acmicpc.net/problem/2133), [9461](https://www.acmicpc.net/problem/9461), [2225](https://www.acmicpc.net/problem/2225), [2011](https://www.acmicpc.net/problem/2011), [11052](https://www.acmicpc.net/problem/11052)

### 기타
[2751](https://www.acmicpc.net/problem/2751), [11650](https://www.acmicpc.net/problem/11650), [11651](https://www.acmicpc.net/problem/11651), [10814](https://www.acmicpc.net/problem/10814), [10825](https://www.acmicpc.net/problem/10825), [10989](https://www.acmicpc.net/problem/10989), [11652](https://www.acmicpc.net/problem/11652), [11004](https://www.acmicpc.net/problem/11004), [10828](https://www.acmicpc.net/problem/10828), [9012](https://www.acmicpc.net/problem/9012), [10799](https://www.acmicpc.net/problem/10799), [10845](https://www.acmicpc.net/problem/10845), [10866](https://www.acmicpc.net/problem/10866), [10808](https://www.acmicpc.net/problem/10808), [10809](https://www.acmicpc.net/problem/10809), [10820](https://www.acmicpc.net/problem/10820), [2743](https://www.acmicpc.net/problem/2743), [11655](https://www.acmicpc.net/problem/11655), [10824](https://www.acmicpc.net/problem/10824), [11656](https://www.acmicpc.net/problem/11656), [1406](https://www.acmicpc.net/problem/1406), [1158](https://www.acmicpc.net/problem/1158), [1168](https://www.acmicpc.net/problem/1168), [10430](https://www.acmicpc.net/problem/10430), [2609](https://www.acmicpc.net/problem/2609), [1934](https://www.acmicpc.net/problem/1934), [1850](https://www.acmicpc.net/problem/1850), [9613](https://www.acmicpc.net/problem/9613), [11005](https://www.acmicpc.net/problem/11005), [2745](https://www.acmicpc.net/problem/2745), [1373](https://www.acmicpc.net/problem/1373), [1212](https://www.acmicpc.net/problem/1212), [2089](https://www.acmicpc.net/problem/2089), [11576](https://www.acmicpc.net/problem/11576), [1978](https://www.acmicpc.net/problem/1978), [1929](https://www.acmicpc.net/problem/1929), [6588](https://www.acmicpc.net/problem/6588), [11653](https://www.acmicpc.net/problem/11653), [10872](https://www.acmicpc.net/problem/10872), [1676](https://www.acmicpc.net/problem/1676), [2004](https://www.acmicpc.net/problem/2004)
Expand Down
125 changes: 125 additions & 0 deletions dp/m_가장_긴_바이토닉_부분_수열.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package test.boj.dp;

import org.junit.*;

import java.io.*;
import java.util.StringTokenizer;
import java.util.stream.IntStream;

import static org.assertj.core.api.Assertions.assertThat;

// https://cheolhojung.github.io/posts/algorithm/boj-biotonic-partial-sequence.html
public class m_가__바이토닉_부분_수열 {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int n = Integer.parseInt(br.readLine());
BitonicSubSequence biTonicSubNumbers = new BitonicSubSequence(n, br.readLine());
System.out.println(biTonicSubNumbers.maxLength());

bw.flush();
bw.close();
br.close();
}

@Test
public void test() {
assertThat(solution(1, "1"))
.isEqualTo(1);
assertThat(solution(10, "1 5 2 1 4 3 4 5 2 1"))
.isEqualTo(7);
assertThat(solution(7, "10 5 10 20 10 30 5"))
.isEqualTo(5);
}

private int solution(int n, String numbers) {
BitonicSubSequence biTonicSubNumbers = new BitonicSubSequence(n, numbers);

return biTonicSubNumbers.maxLength();
}

static class BitonicSubSequence {

private static final int MAX_LENGTH = 1000;
private static final int PREV_SMALLER = 0;
private static final int NEXT_SMALLER = 1;

private final int n;
private final int[] numbers;

private int[][] dp;

public BitonicSubSequence(int n, String numbers) {
this.n = n;
this.numbers = new int[n + 2];
this.dp = new int[2][MAX_LENGTH + 1];

StringTokenizer tokenizer = new StringTokenizer(numbers);
for (int i = 1; i <= n; i++) {
this.numbers[i] = Integer.parseInt(tokenizer.nextToken());
}
}

public int maxLength() {
int result = Integer.MIN_VALUE;

for (int i = 1; i <= n; i++) {
dp[PREV_SMALLER][i] = maxLengthPrevSmallerNumbers(i) + 1;
}

for (int i = n; i >= 1; i--) {
dp[NEXT_SMALLER][i] = maxLengthNextSmallerNumbers(i) + 1;
result = Math.max(result, dp[NEXT_SMALLER][i] + dp[PREV_SMALLER][i] - 1);
}

return result;
}

private int maxLengthNextSmallerNumbers(int i) {
return maxRangeClosed(i + 1, n, i, NEXT_SMALLER);
}

private int maxLengthPrevSmallerNumbers(int i) {
return maxRangeClosed(1, i - 1, i, PREV_SMALLER);
}

private int maxRangeClosed(int start, int end, int i, int SMALLER_INDEX) {
return IntStream.rangeClosed(start, end)
.map(j -> max(i, j, SMALLER_INDEX))
.max()
.orElse(0);
}

private int max(int i, int j, int SMALLER_INDEX) {
if (this.numbers[i] > this.numbers[j]) {
return dp[SMALLER_INDEX][j];
}
return 0;
}

// private int maxLengthNextSmallerNumbers2(int i) {
// int result = 0;
// for (int j = i + 1; j <= n; j++) {
// result = max(result, i, j, NEXT_SMALLER);
// }
// return result;
// }
//
// private int maxLengthPrevSmallerNumbers2(int i) {
// int result = 0;
// for (int j = i - 1; j >= 1; j--) {
// result = max(result, i, j, PREV_SMALLER);
// }
// return result;
// }
//
// private int max(int result, int i, int j, int SMALLER_INDEX) {
// if (this.numbers[i] > this.numbers[j]) {
// return Math.max(result, dp[SMALLER_INDEX][j]);
// }
// return result;
// }
}
}
89 changes: 89 additions & 0 deletions dp/n_연속합.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package test.boj.dp;

import org.junit.*;

import java.io.*;
import java.util.StringTokenizer;

import static org.assertj.core.api.Assertions.assertThat;

public class n_연속합 {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int n = Integer.parseInt(br.readLine());
ContinuousSum continuousSum = new ContinuousSum(n, br.readLine());
System.out.println(continuousSum.max());

bw.flush();
bw.close();
br.close();

}

@Test
public void test() {
assertThat(solution(10, "10 -4 3 1 5 6 -35 12 21 -1"))
.isEqualTo(33);
assertThat(solution(1, "1"))
.isEqualTo(1);
assertThat(solution(1, "-1000"))
.isEqualTo(-1000);
assertThat(solution(2, "-2000 -1000"))
.isEqualTo(-1000);
assertThat(solution(2, "-1000 -2000"))
.isEqualTo(-1000);
assertThat(solution(3, "-1000 5 1000"))
.isEqualTo(1005);
assertThat(solution(5, "-3 -1 2 -1 5"))
.isEqualTo(6);
}

private int solution(int n, String numbers) {
ContinuousSum continuousSum = new ContinuousSum(n, numbers);
return continuousSum.max();
}

static class ContinuousSum {

private final int n;
private final int[] numbers;
private final int[] dp;

public ContinuousSum(int n, String numbers) {
this.n = n;
this.dp = new int[n + 1];
this.numbers = new int[n + 1];
StringTokenizer tokenizer = new StringTokenizer(numbers);
for (int i = 1; i <= n; i++) {
this.numbers[i] = Integer.parseInt(tokenizer.nextToken());
}
}

// 현재 숫자를 이전 숫자까지의 합과 더한 경우와
// 현재 숫자부터 시작하는 경우로 나눌 수 있음
// dp[i - 1] + this.numbers[i]: 현재 숫자를 이전 숫자까지의 합과 더한 경우
// this.numbers[i]: 현재 숫자부터 시작하는 경우
// -1000 5 1000
// dp -1000 5 1005
// O -1005 1005
// X 5 1000
public int max() {
int result = this.numbers[1];
dp[1] = this.numbers[1];

for (int i = 2; i <= n; i++) {

dp[i] = Math.max(
dp[i - 1] + this.numbers[i],
this.numbers[i]
);

result = Math.max(result, dp[i]);
}
return result;
}
}
}

0 comments on commit c316a71

Please sign in to comment.