Ich schrieb eine rekursive DP-Lösung für ein Problem. Die Lösung schlägt bei einigen Testfällen fehl (es wird nur eine einzige Umdrehung zu viel oder zu wenig gezählt). Wie kann ich nur die Status rückverfolgen oder drucken, die zu meiner endgültigen Antwort geführt haben?Der einfachste Weg, rekursive Aufrufe zu verfolgen?
Die rekursive Funktion ist so etwas. Es dauert 4 Eingänge. Wenn ein bestimmter Zustand zuvor ausgewertet wurde, gibt er die Lösung von std::map
zurück, andernfalls wertet er ihn aus. Die Lösung gibt den Wert min
für jeden Status rekursiv zurück.
Dies ist ein Versuch Play the Dragon von 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))
)
)
);
}
}