我想计算给定二维数组中的最小和
#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)的单元格你可以假设所有的成本都是正整数。
最佳答案
我看到这是一个动态编程解决方案。
你在这里输入错误:
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
)。关于c++ - 最低费用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7985564/