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 39 40 41 42 43 44 45 46 47 48 | #include <stdio.h> int N, n[52], memo[52][500001], maxx; int abs(int a, int b){ if (a > b)return a - b; return b - a; } int max(int a, int b){ if (a > b)return a ; return b; } int dfs(int left, int right, int index){ int t, result = -1, temp; t = abs(left, right); if (memo[index][t] != 0)return memo[index][t]; if (t == 0 && left != 0) result = left; if (index <= N){ result = max(result, dfs(left + n[index], right, index + 1)); result = max(result, dfs(left, right + n[index], index + 1)); result = max(result, dfs(left, right, index + 1)); } return memo[index][t] = result; } int main(void) { int i, j, k, temp, sol; maxx = 0; scanf("%d", &N); for (i = 1; i <= N; i++){ scanf("%d", &n[i]); maxx += n[i]; } printf("%d", dfs(0, 0, 1)); i = 1; return 0; } | cs |
같은 탑
문제집
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 2 초 | 128 MB | 1435 | 285 | 169 | 17.245% |
문제
홍준이는 N개의 직사각형 블럭을 가지고 있다. 홍준이는 블럭 위에 또다른 블럭을 올려놓는 방식으로 탑을 만들 수 있다. 이 때, 두 개의 탑을 만드는데, 이 두 탑의 높이가 같게 만드려고 한다. (각 탑은 적어도 한 개의 블럭을 포함해야 한다) 홍준이는 되도록이면 탑의 높이를 최대로 하려고 한다. 그리고 모든 블럭을 사용할 필요는 없다.
각 블럭의 높이가 주어질 때, 홍준이가 만들 수 있는 탑의 높이의 최대값을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 조각의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 각 조각의 높이가 주어진다. 높이는 500,000보다 작거나 같은 자연수이고, 모든 조각의 높이의 합은 500,000을 넘지 않는다.
출력
첫째 줄에 문제의 정답을 출력한다. 불가능할 때는 -1을 출력한다.
예제 입력 복사
3
2 3 5
예제 출력 복사
5
아무래도 왼쪽 - 오른쪽으로 메모이제이션하는부분이 문제 일거같은데 [500000][500000] 배열을 못만들어서