質問はスタックオーバーフローに掲載されたこの問題を解決するためのアルゴリズムを求めて:
nxnの行列(Aと呼びます)があります。行列Aからポイントのサブセット(Bと呼びます)を選択します。サブセットはn個の要素で構成され、Aの各行と各列から1つだけの要素が取得されます。出力はソリューション( B)これらの制約を考慮して、Bを構成する要素の合計が可能な最大値になるようにします(たとえば、以下の例では25)。Bの複数のインスタンスが見つかった場合(つまり、同じ最大合計を与える異なるソリューション)、最大の最小要素を持つBのソリューションを選択する必要があります。
Bは、nxnの選択行列にすることもできますが、n個の目的の要素のみが非ゼロです。
例:A =
|5 4 3 2 1| |4 3 2 1 5| |3 2 1 5 4| |2 1 5 4 3| |1 5 4 3 2|
=> Bは
|5 5 5 5 5|
私は動的プログラミングソリューションを提案しましたが、これは他のソリューションと同じくらい効率的だと思います。以下の提案されたアルゴリズムをコピーして貼り付けました。
- してみましょうの正方形アレイもでの数字。
- LETの要素示しにおける行と列目を。
i
j
- LETはの正方形サブアレイの数値非重複の最適和を表す行の交点を含むがにと列がに。
次に、重複しない数値の最適な合計が示さS( 1:n , 1:n )
れ、次のように与えられます。
Note that S( i:i, j:j ) is simply Aij.
つまり、サイズの正方形の配列の最適な合計は、サイズn
の4つのサブ配列のそれぞれの最適な合計を個別に計算し、n-1
サブアレイと「省略された要素」の合計を最大化することによって決定できます。」
S for |# # # #|
|# # # #|
|# # # #|
|# # # #|
Is the best of the sums S for:
|# | | #| |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | | #| |# |
これは非常に洗練されたアルゴリズムであり、私はそれが正しいことを強く疑っていますが、正しいことを証明する方法を思いつきません。
問題が最適な下部構造を表示することを証明している主な難しさ。各計算の4つの潜在的な選択肢が4つだけの選択肢である場合、これは最適な部分構造を示すのに十分だと思います。つまり、次のことを証明する必要があります。
| # |
| # # #|
| # # #|
| # # #|
不可能(つまり、矛盾による証明)であるため、またはこの可能性が4つの「n-1
正方形」のバリエーションの1つによってすでに説明されているため、これは有効なソリューションではありません。
誰かが私のアルゴリズムの欠陥を指摘したり、それが本当に機能している証拠を提供したりできますか?
O(N^3)
、それが機能しない場合を除いて、それが機能した場合はそうでした。だからプー。