私たちはアイテム1、...、nのシーケンスを持ち、すべてのアイテムはスコア(i)を持っています。アイテムを選択した場合、i + 1、... i + rest(i)アイテムは選択できません。目標は合計スコアを最大にすることです。最大ゲインで順にジャンプ - 動的プログラミング
これを動的プログラミングで解決できます。
最初の項目には2つのオプションがあります。またはそれを選択して残りの(1)+ 1項目に行くか、それを選択せずに2番目の項目に移動します。
再帰関数:
c[i] = max{ c[i - 1], c[i + rest(i) + 1] + score(i) }
この再帰関数の問題点は、サブ問題は独立していないという意味のサブ問題の間のサイクルを作成することです。
私はたぶんソリューションは、アイテムiにつながるすべての項目を与え、その後、それらの間の最大のスコアを取る機能を持っているだろう
c[i] = max{ c[i - 1], c[i - itemThatWentToItem(i)] + score(i) }
のようなものを持っていることが理想的であると思います。
もう1つのアイデアは、この問題をDAG内の最長パスに変更して、すべてのサブグラフに対して実行することです。
アイデア?
最後から計算してください。c [i] = max {c [i + 1]、c [i + rest(i)+ 1] +スコア(i)} – Ante
愚かな質問ですが、私は再帰関数でそれを行うことはできますか?また、最終的な解はc [0]ですか? – Laxmana