配列内のLIS(Longest Increasing Subsequence)の計算は、非常に有名な動的プログラミング問題です。しかし、すべてのチュートリアルでは、最初にDPの概念を使用せずに再帰的解を示し、Bottom-Up DP(反復解)を適用して解く。1D最長増加サブシーケンスの再帰的解法でのメモ化
私の質問は:
がどのように我々は再帰ソリューション自体にメモ化を使用します。 Memoizationだけでなく、1Dアレイを使用してメモを作成する。
私はいくつかの調査を行いましたが、関連性は見つかりませんでした。再帰的メモ帳が尋ねられた場所は2つありますが、1 & 2がありますが、その上の解決策は、メモ帳に2D Map/Arrayを使用しています。
とにかく1D配列の解をメモしてに出力すると、が間違っています。私はこのソリューションのように間違った出力を与えている理由を知っているが、
int lis(int idx, int prev)
{
if(idx >= N)
return 0;
if(dp[idx])
return dp[idx];
int best_ans = lis(idx+1, prev);
int cur_ans = 0;
if(arr[idx] > prev)
{
cur_ans = 1 + lis(idx+1, arr[idx]);
}
int ans = max(best_ans, cur_ans);
dp[idx] = ans;
return ans;
}
int main()
{
// Scan N
// Scan arr
ans = lis(0, -1));
print ans;
}
:ここに は私がやったことある
たものに基づいて寄付インデックスに複数の解決策がある場合もあります前の値。
しかし、私はまだそれが1D配列を使ってどのようにすることができるか知りたいです。
私はすべてのDP トップダウンソリューションはボトムアップおよびその逆に再フレーミングすることができることを読んだので、私は解決策を知って好奇心旺盛です。
誰かが同じことについて洞察を与えることができれば、非常に役に立ちます。
ありがとうございます。
お返事ありがとうございます。そして、はい、あなたは非常に正しいです。私は特にトップダウンメモ帳のスペース要件がボトムアップのものよりも多い場合を見てきました。ほとんどの場合、なぜこれが行われているのかがかなりわかりますが、上記の行*は必要なくなりましたが、これは直感的ではありません**。あなたは同じことについての洞察が何であるかをさらに説明できますか?さらに、このユーティリティを得るためにトップダウン手法を使用できない理由を知りたい。 LISの問題についてもplzで説明します。 –
@ ShivangBansalその理由は、再帰+ memoizeは特定のデータが再び必要とされないことを知らないので、すべてを保持しなければならないからです。ボトムアップでは、データを移動したときにデータが実際に完了した時点を知ることができます。それが直感的に理解できない場合は、私はエッセイを書くことができます。 – btilly
申し訳ありませんが私は明確にすることはできません。 – btilly