N개의 블록이 순서대로 있는데
부분수열처럼 각 블록의 순서는 뒤바꿀 수 없고 (중간의 몇 개를 빼는 식으로, 1번 5번 6번 9번 이렇게 쌓는 식)
인접한 블록을 연속으로 쌓을 때는 블록의 구멍이 딱 맞아서 두 블록 자체의 높이 빼기 아래 블록의 구멍 깊이만큼이 두 블록의 높이가 됨
그리고 전체 높이가 일정 높이 이하여야 함
예를 들어서 최대 높이가 H, i번째 블록 높이가 h_i, 깊이가 d_i라고 하면
1, 3, 4, 7 블록을 쌓은 건 h1+h3-d3+h4+h7 <= H인 식으로
이런 경우의 수가 총 몇 개인지 구해야 하는데 단순히 재귀적으로 짜니까 지수함수 꼴에 가깝게 나오네
각 블록에 대해서 들어가거나 들어가지 않는 식으로 2^N...
원래는 특정 i번째 블록을 기준으로 잡아서 1~i-2번째 블록이 H-h_i 이하의 높이로 쌓이는 가짓수랑
i-1번째 블록을 무조건 쌓고 그 아래로 1~i-2번째 블록에 대해 저 i번째 블록에 대해 한 것처럼 점화식으로 하고 하는 식으로 생각해보려다가
( G(i, H) = F(i-2, H-h_i) + G(i-1, H-h_i-1+d_i-1-h_i) 같은 식으로)
어차피 특정 높이에 따라서 i+1번쨰 블록부터 어떻게 쌓을지 가짓수가 달라져서 의미가 없는 거 같기도 하고...
뭔가 좀 아이디어 없을까
PS갤로
너가 적은 점화식같은 접근도 value는 input size에 exponential할 수 있어서 poly-time에 안돌아갈거같음.
PS갤이 어디냐/ 그리고 ㅇㅇ 아무래도 위에 적은 것처럼 지수함수 꼴에서 크게 안 변할 거 같다......
https://gall.dcinside.com/mgallery/board/lists/?id=ps&page=1
/지금보니까 d_i=0 넣으면 subsetsum의 variation같은데 poly-time에 안풀릴 확률이 커보이네. O(nH) dp가 젤 날듯
사실 문제를 글자그대로 보면 가지수가 많아서 어렵고 가능한 시나리오 몇개만 생각하면, 1. h_i와 d_i가 모두 정수인경우 (따라서 H도 정수): knapsack 문제와 비슷한 방식으로 DP 가능 (O(H))
오 ㄳㄳ 바꿔서 짜봐야겠네
2. Worst case는 exponential이라도 Backtracking으로 높이 H 넘으면 끊어내서 전체탐색
최적해만 찾는거면
https://en.m.wikipedia.org/wiki/Iterative_deepening_A*
같은 식으로 전체탐색하거나, 유사해면 Simulated Annealing이나 Genetic Algorithm같은 유사해 탐색 알고리즘 대충 구현해서 쓰면 잘 찾을듯