矩阵的最小路径和

来源:互联网 发布:js将时间字符串格式化 编辑:程序博客网 时间:2024/04/27 07:46

题目

给定一个矩阵,从左上角开始,每次只能向右或向下走,最后到达右下角位置,路径上所有的数字累加起来就是路径和,返回所有的路径中最小的路径和。

1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0

思路

经典动态规划方法,假设矩阵m行数为M, 列为N,先生成大小和矩阵相等的矩阵dp,dp [i][j]表示从左上角(0,0)位置走到(i, j)位置的最小路径和。对m的第一行来说,从(0,0)位置到(0,i)位置只能右走,因此,(0,0)位置到(0,j)位置的路径和就是m[0][0…j]累加的结果,同理可得第一列的值。从(0,0)到(i,j)的路径必然经过位置(i-1,j)或(i, j-1),所以,dp[i][j]=min{dp[i-1][j], dp[i][j-1]} + m[i][j];

代码

#include<algorithm>#include<iostream>#include<cstring>using namespace std;int main() {    int m, n;    cin >> m >> n;    int arr[m][n];    int dp[m][n];    memset(dp, 0, sizeof(dp));    for(int i=0; i<m; i++)        for(int j=0; j<n; j++)            cin >> arr[i][j];    dp[0][0] = arr[0][0];    for(int i=1; i<m; i++)        dp[i][0] = dp[i-1][0]+arr[i][0];    for(int i=1; i<n; i++)        dp[0][i] = dp[0][i-1]+arr[0][i];    for(int i=1; i<m; i++)        for(int j=1; j<n; j++)            dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + arr[i][j];    cout << dp[m-1][n-1] << endl;}
0 0