Dynamic 矩阵优化中的所有最小值

Dynamic 矩阵优化中的所有最小值,dynamic,matrix,minimum,Dynamic,Matrix,Minimum,我有一个矩阵nxn,带有正整数。我必须计算每个元素的成本 成本(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;

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

成本(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);

        }

       }

     }

}
for(int i=0;i

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

我在n^2中解决了这个问题。其思想是在行(右-左和左-右)和列(上-下和下-上)上迭代

无效排序(整数**v){

//在线

对于(int i=0;i
//从左到右
对于(int j=1;j=0;j--){
如果(v[i][j+1]+1
}

//柱上

对于(int j=0;j
//从上到下
对于(int i=1;i=0;i--){
如果(v[i+1][j]+1
//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];
}
//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];
}