글
Dynamic Programming - Counting Boolean Parenthesizations, Optimal Strategy for a Game
- Counting Boolean Parenthesizations
문제) 5개의 심볼을 가지고 만든 Boolean Expression을 괄호로 묶어 Evaluation했을 때,
결과가 true 가 되는 Case 의 갯수는 몇 개인가?
심볼 = { true, false, and, or, xor }
예를 들면, ' false and true xor true '가 true 가 되는 괄호 묶기 방법은 1가지 밖에 없다.
- Optimal Strategy for a Game
문제) N 개의 동전이 있다. (N은 항상 짝수)
각 동전의 가치는 V(0)...V(N)이며, 이 동전들은 일렬로 놓여져 있다.
두 사람이 일렬로 놓여져 있는 동전의 양쪽 끝 동전 중 하나를 가질 수 있다고 할 때,
처음 시작하는 사람이 가능한 최대 금액은 얼마인가?
상대방이 무엇을 선택하는지는 여기에서 문제가 아니다.
모든 경우의 수에서 최대값을 찾는 문제인 것이다.
처음엔 "상대방은?" 이라는 생각에 잠시 혼란스러웠었다.
두 문제 다, 나름 풀만한 문제였다.
근데, 이 두 문제 전에 있는 문제인 Edit Distance는 당췌 아이디어가 안 떠오르네...
'프로그래밍' 카테고리의 다른 글
| fgets(buf, buf_size, stdin), gets(buf) 차이? (0) | 2013.02.20 |
|---|---|
| Dynamic Programming - Edit Distance, Two-Person Traversal... (0) | 2012.08.09 |
| Dynamic Programming - Building Bridges, Balanced Partition. (2) | 2012.08.06 |
| Dynamic Programming - Longest Increasing Subsequence, Box Stacking (0) | 2012.08.03 |
| Dynamic Programming - Make Change Problem (2) | 2012.08.01 |
글
Dynamic Programming - Building Bridges, Balanced Partition.
1) Building Bridges
문제내용:
가운데로 강이 지나가는 2차원 지도가 있다. 강 북쪽과 남쪽으로 각각 N 개의 도시가 있다.
이 N 개의 도시를 A(1)...A(N), B(1)...B(N) 이라고 한다.
이 도시는 순서대로 위치해 있지는 않다. (즉 A(1) 옆에 A(2) 가 있는게 아니라는 말)
강 북쪽과 남쪽은 연결하는 다리를 건설하고자 하는데,
다리의 건설은 A(k) 와 B(k) 만 연결할 수 있다.
이 때, 가장 다리를 많이 놓을 수 있는 갯수는 몇 개 인가?
설명이 은근히 길다.
그림으로 그리고 싶지만, 잘 찾지도 못하겠고 그리기도 귀찮아서 패스.
- Balanced Partition
문제:
N 개의 정수를 가진 집합을 2개의 Subset S1, S2 로 나누었을 때, |Sum(S1) - Sum(S2)| 의 최소값을 구하라.
사실 이 문제는 내가 못 풀었다.
Subset 을 나누는 데, 단순히 한 Element 를 기준으로 좌/우로 나누는 건줄 알았다.
그래서 문제를 이해해서 제대로 못 풀었다.
그리고 해답을 얼핏 보고 아하.. 하고 다시 푼 문제.
'프로그래밍' 카테고리의 다른 글
| Dynamic Programming - Edit Distance, Two-Person Traversal... (0) | 2012.08.09 |
|---|---|
| Dynamic Programming - Counting Boolean Parenthesizations, Optimal Strategy for a Game (0) | 2012.08.07 |
| Dynamic Programming - Longest Increasing Subsequence, Box Stacking (0) | 2012.08.03 |
| Dynamic Programming - Make Change Problem (2) | 2012.08.01 |
| Dynamic Programming - Maximal Contiguous Subsequent Sum Problem (2) | 2012.07.31 |
글
Dynamic Programming - Longest Increasing Subsequence, Box Stacking
- Longest Increasing Subsequence
임의의 순서로 나열된 집합 A 가 있을 때,
값이 증가하는 최장 길이 수열을 찾는 문제이다.
단, 수열은 인접해 있을 필요는 없고,
이러한 수열은 여러가지 종류가 있을 수 있다.
예를들어 아래와 같은 수열이 있을 경우
{ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 }
LIS 는 0, 2, 6, 9, 13, 15 혹은 0, 4, 6, 9, 11, 15 이 되겠다.
처음에는 2차원 배열로 계산을 했었는데,
그다지 좋은 방법은 아니었다.
메모리도 많이 쓰고 최장 길이는 찾을 수 있었으나, 실제 수열을 찾지는 못했기에...
- Box Stacking
임의의 N 개 타입의 박스가 있을 때, 박스를 가장 높이 쌓을 수 있는 경우와 그 높이를 구하는 문제이다.
박스의 갯수는 제한이 없다.
단, 박스를 쌓기 위해서는 strictly larger 야 한다.
( 즉, 박스의 Width > Depth 라고 했을 때,
아래박스.Width > 위박스.Width && 아래박스.Depth > 위박스.Depth 를 만족해야 한다. )
* Box Stacking 문제부터 STL을 사용 해 보았는데,
Box Class 의 Sorting 이 조금 문제가 있었다.
STL 의 sort() 를 이용하기 위해 operator < 오버로딩 하였는데,
단순히 return (w > b.w && d > d.w); 를 하게 되면,
원하는대로 정렬이 되지 않아, !((w < b.w) || (d < b.d)); 를 사용하였다.
Box 처럼 크다, 작다, 크지도 작지도 않다, 같다.. 이런식으로 구분되는 것에는 좀 주의해야 하겠다.
'프로그래밍' 카테고리의 다른 글
| Dynamic Programming - Counting Boolean Parenthesizations, Optimal Strategy for a Game (0) | 2012.08.07 |
|---|---|
| Dynamic Programming - Building Bridges, Balanced Partition. (2) | 2012.08.06 |
| Dynamic Programming - Make Change Problem (2) | 2012.08.01 |
| Dynamic Programming - Maximal Contiguous Subsequent Sum Problem (2) | 2012.07.31 |
| Dynamic Programming - Knapsack Problem (0) | 2012.07.31 |