[DP] 상자 쌓기 문제
5749 단어 dp
사고방식: 동적 기획
가장 좋은 해답은 반드시 max({box 1 be the bottom}, {box 2 be the bottom},..., {box n be the bottom})이다. 그래서 우리는 모든 box를 두루 돌아다니며 각각의 box를 밑부분으로subproblem을 구축한다.
subproblem {box 1 be the bottom}에서는 box candidates에서 box1, 이미 바닥으로 사용되었기 때문에 옮겨다닐 때 박스를 뛰어넘어야 한다1, 그러나 이렇게 하면 문제의 복잡성을 크게 증가시킬 수 있다.
다행히 이 문제는 특별한 점이 있다. strictly better, 만약box1 이미 밑에 있습니다. candidates에 다시 나타나도 선택되지 않고 문제가 발생하지 않습니다.
코드:
package chapter9;
import java.util.ArrayList;
import java.util.HashMap;
public class P10_book_ {
public ArrayList<Box> createStack(Box[] boxes){
return createStackR(boxes, null, new HashMap<Box, ArrayList<Box>>());
}
public ArrayList<Box> createStackR(Box[] boxes, Box bottom,
HashMap<Box, ArrayList<Box>> stackMap){
if(stackMap.containsKey(bottom))
return stackMap.get(bottom);
ArrayList<Box> bestStack = new ArrayList<Box>();
int bestHeight = 0;
for(Box b : boxes){
if(b.canBeAbove(bottom)){
ArrayList<Box> newStack = createStackR(boxes, b, stackMap);
int newHeight = stackHeight(newStack);
if(newHeight > bestHeight){
bestHeight = newHeight;
bestStack = newStack;
}
}
}
// make a copy of bestStack before modify it
bestStack = (ArrayList<Box>)bestStack.clone();
if(bottom != null)
bestStack.add(bottom);
stackMap.put(bottom, bestStack);
return bestStack;
}
public int stackHeight(ArrayList<Box> stack){
if(stack == null || stack.isEmpty())
return 0;
int totalHeight = 0;
for(Box b : stack){
totalHeight += b.height;
}
return totalHeight;
}
}
class Box{
int width;
int height;
int depth;
public boolean canBeAbove(Box box){
if(box == null)
return true;
if(width < box.width && height < box.height && depth < box.depth){
return true;
}
return false;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【경쟁 프로 전형적인 90문】008의 해설(python)의 해설 기사입니다. 해설의 이미지를 봐도 모르는 (이해력이 부족한) 것이 많이 있었으므로, 나중에 다시 풀었을 때에 확인할 수 있도록 정리했습니다. ※순차적으로, 모든 문제의 해설 기사를 들어갈 예정입니다. 문자열...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.