我有一个矩阵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)的最优解。我知道这是可能的,我听说解决方案是编程动态,但我看不出它是如何可能的。
答案 0 :(得分:0)
我在n ^ 2中解决了。我们的想法是在行(左右和左右)和列(上下和下行)上进行迭代。
void sort(int ** v){
//在线
for(int i = 0; i&lt; n; 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&lt; n; 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];
}
} }