矩阵最小路径

原创


问题描述:

给出一个 n x m 的矩阵,从左上角开始每次只能向右走或者向下走,

最后达到右下角的位置,路径中所有数字累加起来就是路径和,返回所有路径的最小路径和。

比如:

1  3  5  9

8  1  3  4

5  0  6  1

8  8  4  0

最短路径是12

解题思路:

此题属于动态规划类题目,我们可以用一个dp二维数组存放最短路径,dp[i][j]就是左上角到位置(i,j)

的最短路径,我们要求的是dp[n][m],我们只需要从dp[i-1][j],dp[i][j-1]这两个中选出最小者再加上

dp[n][m]自己本身的路径就可以了。

 代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 int min(int a,int b)
 5 {
 6     return a<b?a:b;
 7 }
 8 
 9 int main()
10 {
11     int n,m;
12     scanf("%d%d",&n,&m);    //n行m列 
13     
14     int **arr,**dp;    //分配空间
15     arr=(int **)malloc(sizeof(int *)*n);
16     dp=(int **)malloc(sizeof(int *)*n);    //dp[i][j]代表从左上角到位置(i,j)时的最短距离 
17     int i;
18     for(i=0;i<=n-1;i++)
19     { 
20         arr[i]=(int *)malloc(sizeof(int)*m);
21         dp[i]=(int *)malloc(sizeof(int)*m);
22     } 
23         
24     int j;    //数组赋值 
25     for(i=0;i<=n-1;i++)
26         for(j=0;j<=m-1;j++)
27             scanf("%d",&arr[i][j]);
28             
29     for(i=0;i<=n-1;i++)
30         for(j=0;j<=m-1;j++)
31         {
32             if(i==0 && j==0)
33                 dp[i][j]=arr[i][j];
34             if(i==0 && j!=0)    //第一行边界
35                 dp[i][j]=arr[i][j-1]+arr[i][j];
36             if(i!=0 && j==0)    //第一列边界 
37                 dp[i][j]=arr[i-1][j]+arr[i][j];
38             if(i!=0 && j!=0)    //其他
39                 dp[i][j]=arr[i][j]+min(dp[i-1][j],dp[i][j-1]);
40         }    
41     printf("%d",dp[n-1][m-1]);
42     return 0;
43 } 
View Code

 2018-03-19

转载于:https://www.cnblogs.com/chiweiming/p/8603948.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值