矩阵优化中的所有最小值

Posted

技术标签:

【中文标题】矩阵优化中的所有最小值【英文标题】:All minimum values in matrix optimization 【发布时间】:2012-10-22 07:27:59 【问题描述】:

我有一个矩阵nxn,带有正整数。我必须计算每个元素的成本。

Cost(i, j) = min( val(p, r) + dist(pos(i, j) ,pos(p, r)) ), p, r = 0:n-1.

dist(pos(i, j) ,pos(p, r)) = |i - p| + |j – r|(距离曼哈顿)

我用这样的方法在 O(n^4) 中解决了这个问题:

for(int i = 0 ; i < n ; i ++)

  for(int j = 0 ; j < n ; j ++) 
    int cost = 9999999;

    for(p = 0 ; p < n ; p ++) 

      for(r = 0 ; r < n ; r ++) 

        if( val[p][r] + abs(i-p) + abs(j-r)) < cost 

           cost = val[p][r] + abs(i-p) + abs(j-r);

        

       

     


现在,我需要 O(n^2) 的最优解。我知道这是可能的,而且我听说解决方案是动态编程,但我看不出这怎么可能。

【问题讨论】:

【参考方案1】:

我在 n^2 中解决了。这个想法是在行(左右和左右)和列(上下和上下)上进行迭代。

无效排序(int **v)

//上线

for(int i = 0 ; i

//left to right
for(int j = 1 ; j < n ; j ++) 
  if(v[i][j-1] + 1 < v[i][j])
    v[i][j] = 1 + v[i][j-1];

//right to left
for(int j = n-2 ; j >= 0 ; j --) 
  if(v[i][j+1] + 1 < v[i][j])
    v[i][j] = 1 + v[i][j+1];

//在列上

for(int j = 0 ; j

//up to down
for(int i = 1 ; i < n ; i ++) 
  if(v[i-1][j] + 1 < v[i][j])
    v[i][j] = 1 + v[i-1][j];

//down to up
for(int i = n-2 ; i >= 0 ; i --) 
  if(v[i+1][j] +1 <v[i][j])
    v[i][j] = 1 + v[i+1][j];

【讨论】:

以上是关于矩阵优化中的所有最小值的主要内容,如果未能解决你的问题,请参考以下文章

理想的正方形 单调队列优化DP

matlab 求出一维矩阵中最小值,且求出该最小值在矩阵中的位置,求各位帮帮忙

矩阵中所有行的最小值

屏蔽矩阵行中的最小值

在 O(n) 时间内找到 n x n 矩阵中的局部最小值

怎么求Mat矩阵的最大最小值