문제에 재귀 DP 솔루션을 작성했습니다. 솔루션은 일부 테스트 케이스에서는 실패합니다 (오버 카운트 또는 1 회전 미만 임). 최종 답장을 이끌어 낸 상태를 어떻게 추적하거나 인쇄 할 수 있습니까?재귀 호출을 추적하는 가장 쉬운 방법은 무엇입니까?
재귀 함수는 다음과 같습니다. 4 개의 입력이 필요합니다. 특정 상태가 이전에 평가 된 경우 std::map
에서 솔루션을 반환하고 그렇지 않으면 평가합니다. 이 솔루션은 모든 상태에 대해 min
값을 재귀 적으로 반환합니다.
이
은 Play the Dragon Google CodeJam 2017 1A의int hd,ad,hk,ak,b,d;
int inf=1e9+1;
map< tuple<int,int,int,int>, int > dp;
int count(int hld, int hlk, int atd, int atk){
if(dp[make_tuple(hld,hlk,atd,atk)]){
return dp[make_tuple(hld,hlk,atd,atk)];
}
else{
if(hlk<=0){
return 0;
}
if(hld<=0){
return inf;
}
if(hlk-atd<=0){
return 1;
}
if(hld==hd-atk){
if(b==0||d==0){
if(b==0&&d!=0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
count(hld-atk+d,hlk,atd,(atk-d)<0?0:(atk-d))
);
}
if(b!=0&&d==0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
count(hld-atk,hlk,atd+b,atk)
);
}
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + count(hld-atk,hlk-atd,atd,atk);
}
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
min(
count(hld-atk,hlk,atd+b,atk),
count(hld-atk+d,hlk,atd,(atk-d)<0?0:(atk-d))
)
);
}
if(b==0||d==0){
if(b==0&&d!=0){
if(atk<=0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + count(hld-atk,hlk-atd,atd,atk);
}
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
min(
count(hd-atk,hlk,atd,atk),
count(hld-atk+d,hlk,atd,(atk-d)<0?0:(atk-d))
)
);
}
if(b!=0&&d==0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
min(
count(hld-atk,hlk,atd+b,atk),
count(hd-atk,hlk,atd,atk)
)
);
}
if(atk<=0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + count(hld-atk,hlk-atd,atd,atk);
}
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
count(hd-atk,hlk,atd,atk)
);
}
if(atk<=0){
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
count(hld-atk,hlk,atd+b,atk)
);
}
return dp[make_tuple(hld,hlk,atd,atk)] = 1 + min(
count(hld-atk,hlk-atd,atd,atk),
min(
count(hld-atk,hlk,atd+b,atk),
min(
count(hd-atk,hlk,atd,atk),
count(hld-(atk-d)<0?0:(atk-d),hlk,atd,(atk-d)<0?0:(atk-d))
)
)
);
}
}