Uma pergunta foi postada no Stack Overflow solicitando um algoritmo para resolver esse problema:
Eu tenho uma matriz (chame de A) que é nxn. Desejo selecionar um subconjunto (denominado B) de pontos da matriz A. O subconjunto consistirá em n elementos, nos quais um e apenas um elemento é obtido de cada linha e de cada coluna de A. A saída deve fornecer uma solução ( B) de modo que a soma dos elementos que compõem B seja o valor máximo possível, dadas essas restrições (por exemplo, 25 no exemplo abaixo). Se várias instâncias de B forem encontradas (ou seja, soluções diferentes que dão a mesma soma máxima), a solução para B que possui o maior elemento mínimo deve ser selecionada.
B também pode ser uma matriz de seleção que é nxn, mas onde apenas os n elementos desejados são diferentes de zero.
Por exemplo: se 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 seria
|5 5 5 5 5|
I propôs uma solução de programação dinâmica que eu suspeito é tão eficiente quanto qualquer solução vai ficar. Copiei e colei meu algoritmo proposto abaixo.
- Deixei ser uma matriz quadrada de de números.
- Deixei denotar o elemento de na
i
quinta linha e naj
coluna. - Deixei denota a soma ideal de números não sobrepostos para um subarray quadrado de contendo a interseção de linhas para e colunas para .
Em seguida, a soma ideal de números não sobrepostos é indicada S( 1:n , 1:n )
e é apresentada da seguinte forma:
Note that S( i:i, j:j ) is simply Aij.
Ou seja, a soma ideal para uma matriz quadrada de tamanho n
pode ser determinada calculando separadamente a soma ideal para cada uma das quatro sub-matrizes de tamanho n-1
e maximizando a soma da sub-matriz e do elemento "deixado de fora" "
S for |# # # #|
|# # # #|
|# # # #|
|# # # #|
Is the best of the sums S for:
|# | | #| |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | |# # # | | # # #|
| # # #| |# # # | | #| |# |
Esse é um algoritmo muito elegante e eu suspeito fortemente que esteja correto, mas não consigo encontrar uma maneira de provar que está correto.
A principal dificuldade que estou enfrentando é provar que o problema exibe uma subestrutura ideal. Acredito que, se as quatro escolhas possíveis em cada cálculo são as únicas quatro opções, isso é suficiente para mostrar a subestrutura ideal. Ou seja, preciso provar que isso:
| # |
| # # #|
| # # #|
| # # #|
Não é uma solução válida, seja porque é impossível (ou seja, prova por contradição) ou porque essa possibilidade já é explicada por uma das quatro n-1
variações "quadradas".
Alguém pode apontar alguma falha no meu algoritmo ou fornecer uma prova de que realmente funciona?
O(N^3)
se funcionasse, exceto que não funciona. Tão pooh.