【问题标题】:minimal cost sum最低成本总和
【发布时间】:2011-11-02 18:34:16
【问题描述】:

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

#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,为什么?这段代码有什么问题? 文字算法

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

【问题讨论】:

  • 你能用文字描述你的算法吗?这适用于代码中的注释块。
  • 我想不出任何方法来解释结果是 8,除了找到最大元素:(
  • 您添加的描述不是对您的算法的描述,而是对问题陈述的描述。
  • 是的,但是,这里有算法提示,那么我的问题定义有什么问题?是代码的动态实现

标签: c++ algorithm


【解决方案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)。

【讨论】:

    【解决方案2】:

    假设 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
    

    【讨论】:

      【解决方案3】:
      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]
      

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

      【讨论】:

        猜你喜欢
        • 2021-09-06
        • 1970-01-01
        • 2013-02-22
        • 2013-03-24
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 2021-10-18
        相关资源
        最近更新 更多