最低成本金额

时间:2011-11-02 18:34:17

标签: c++ algorithm

我想计算给定二维数组中的最小和

#include<iostream>
#include<limits.h>
using namespace std;
#define R 3
#define C 3
int Min(int x,int y,int z){
   if(x<y){
        return (x<z)?x:z;
   }
   else
       return (y<z)?y:z;
   }
int mincost(int cost[R][C],int m,int n){

    int i,j;
    int t[R][C];
    t[0][0]=cost[0][0];
    for(i=1;i<=m;i++)
        t[i][0]=t[i-1][0]+cost[i][0];
    for(j=1;j<=n;j++)
t[0][j]=t[0][j-1]+cost[0][j];
    for(i=1;i<=m;i++){
        for(j=1;j<=n;j++){
            t[i][j]=Min(t[i-1][j-1],t[i-1][j],t[i][j-1]+cost[i][j]);
        }
    }
      return t[m][n];

}

int main(){

    int cost[R][C]={{1,2,3},
                    {4,8,2},
                    {1,5,3}};
    cout<<mincost(cost,2,2)<<endl;


    return 0;
}

从这个数组的起点(0,0)到某个点(m,n)它等于8,但是输出显示我1,为什么?这段代码出了什么问题? 单词算法

  

给定成本矩阵成本[] []和成本[] []中的位置(m,n),写一个函数,返回从(0,0)到达(m,n)的最小成本路径的成本。矩阵的每个单元表示遍历该单元的成本。到达路径的总成本(m,n)是该路径上所有成本的总和(包括源和目的地)。你只能从给定的单元格,即从给定的单元格(i,j),单元格(i + 1,j),(i,j + 1)和(i + 1),向下,向右和对角线地降低单元格。 j + 1)可以遍历。您可以假设所有成本都是正整数。

3 个答案:

答案 0 :(得分:1)

我看到这是一个动态编程解决方案。

你有一个错字:

t[i][j]=Min(t[i-1][j-1],t[i-1][j],t[i][j-1]+cost[i][j]);

它应该是:

t[i][j]=Min(t[i-1][j-1],t[i-1][j],t[i][j-1]) + cost[i][j];

基本上它像t[i][j] = t[i-1][j-1]一样工作。

注意:调试这些问题的一个好方法是打印中间矩阵(此处为:t)。

答案 1 :(得分:1)

鉴于t [0] [0] = cost [0] [0] = 1 然后

for(i=1;i<=m;i++){
        for(j=1;j<=n;j++){
            t[i][j]=Min(t[i-1][j-1],t[i-1][j],t[i][j-1]+cost[i][j]);
        }

表示i = 1,j = 1

t[1][1] = Min(t[0][0], t[0][1], t[1][0]+cost[1][1]) = Min(1, ...) = 1

表示i = 2 j = 2

t[2][2] = Min(t[1][1], t[1][2], t[2][1]+cost[2][2]) = Min(1, ...) = 1

答案 2 :(得分:1)

Min(t[i-1][j-1],t[i-1][j],t[i][j-1]+cost[i][j])

应该是

Min(t[i-1][j-1],t[i-1][j],t[i][j-1]) +cost[i][j]

猜测,很难读出你的意图,但看起来像一个寻路算法。您的代码没有正确地将成本添加到对角线或水平移动中,并且由于开头的成本是1,这也是您的结果。这应该为您的样品返回11的成本。