問題に再帰的なDP解を書きました。解決策はいくつかのテストケースで失敗しています(オーバーカウントまたは1回のアンダーカウント)。最終回答につながった州だけをどのように追跡したり、印刷したりすることができますか?再帰呼び出しを追跡する最も簡単な方法は?
再帰関数は、このようなものです。それは4つの入力を取ります。前に特定の状態が評価されている場合は、std::map
から解決策を返します。それ以外の場合は、それを評価します。このソリューションは、すべての状態に対して再帰的にmin
の値を返します。
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))
)
)
);
}
}