Algorithm 方阵上的最大和

Algorithm 方阵上的最大和,algorithm,matrix,Algorithm,Matrix,给定一个大小为nxn的方阵,其中每个单元由 一个正整数,从该矩阵中找到这样一个由n个整数组成的列表 它们的总和尽可能大,但不能有两个整数 出现在初始矩阵的同一行或同一列中 所以我最好的想法是,既然我们知道选择一个单元格添加到总和中意味着同一行和同一列中的所有单元格将无法再到达那里,我们就可以计算给定单元格的“成本”。由于行中每个单元格的行和都相同,因此我们可以在计算时忽略它。更正式地说: for each cell in each row: if (columnNotYetVisited

给定一个大小为nxn的方阵,其中每个单元由 一个正整数,从该矩阵中找到这样一个由n个整数组成的列表 它们的总和尽可能大,但不能有两个整数 出现在初始矩阵的同一行或同一列中

所以我最好的想法是,既然我们知道选择一个单元格添加到总和中意味着同一行和同一列中的所有单元格将无法再到达那里,我们就可以计算给定单元格的“成本”。由于行中每个单元格的行和都相同,因此我们可以在计算时忽略它。更正式地说:

for each cell in each row:
    if (columnNotYetVisited AND (-1 * sumOfTheColumn) + (2 * valueOfTheCell) > currentMax):
        currentMax = (-1 * sumOfTheColumn) + (2 * valueOfTheCell);

if endOftheRow:
    mark columnWithBestCost as visited;
    add currentMax to finalSum;
虽然它确实对某些输入有效,但也有一些在很大程度上失败了。那么,解决这个问题的最佳方法是什么

编辑:另外,我现在有一个样本测试,以防它派上用场:

7   53  183 439
627 343 773 959
447 283 463 29
217 623 3   399
已编辑
输出:2282(439+773+447+623)

I使用动态规划和位掩码求解

//                 bitmask      
int F(int stage, int selecion)
{
  if(stage == N) return selecion == (1<<N)-1 ? 0 : -INF;

  if(dp[stage][selecion] != -1)
    return dp[stage][selecion];

  int answer = -INF;

  for(int i = 0;i < N;i++)
    if((selecion & (1 << i)) == 0) 
        answer = max(answer, matrix[i][stage] + F(stage+1, selecion | (1 << i) ) );

  dp[stage][selecion] = answer;

  return answer;
}
//位掩码
int F(int阶段,int选择)
{

如果(stage==N)返回selecion==(1您能给我看一些测试用例吗?@Andres-在帖子中添加了一个示例:)请同时添加此测试用例的编号。同时添加代码失败的用例添加了组成测试用例总数的编号。如果我的代码现在失败,将无法添加测试用例,因为我当前手头没有它。