题解 | #最小三角路径和#

最小三角路径和

https://www.nowcoder.com/practice/cc6afb95517f460cb785397c36ae4a9b

知识点:

动态规划/DFS

分析:

方法1:

DFS(动态规划都可以用递归解决)

首先分析,相邻的位置在这里指的是下一行中下标与上一层奶牛下标相同或者等于上一层奶牛下标+1的两个位置。那么也就是在每一个坐标进行位置选择的时候,只可以选择(i+1,j)(i+1,j+1),所以就有两种走的方式。

那么就有两种可能的走法,选择其中和最小的走法即可。那么就是

  1. int p1 = dfs(cows,i+1,j) + cows[i][j];
  2. int p2 = dfs(cows,i+1,j+1) + cows[i][j];

在dfs函数中创建一个f数组用来记录计算过的数据,即记忆化搜索。

详细请看代码

方法2:

dp,动态规划

状态表示:

  1. f[i][j] 表示走到坐标i,j时最小的路径和
  2. 属性: MIN 最小路径和

状态计算:

1. 由于时两种方法,那么如果走左下方 那么就是f[i][j] = f[i-1][j-1]

2. 如果走右下方 那么就是f[i][j] = f[i-1][j]

3.之所以是上面两个等式,是因为,思考状态的时候去掉当前坐标,因为当前坐标是一样的,那么求出来他们的最小值,再加上当前坐标的值即可。

综上 ,f[i][j] = min(f[i-1][j],f[i-1][j-1]) + cows[i][j];

编程语言:

C++

完整代码:

DFS:运行时间:17ms 占用内存:16252KB

dp动态规划:运行时间:3ms 占用内存:504KB

#include <cstring>
class Solution {
public:
    int f[2010][2010];
    int dfs(vector<vector<int> >& cows,int i,int j){
        if(f[i][j] != -1) return f[i][j];
        if(i == cows.size()) return 0;
        int p1 = dfs(cows,i+1,j) + cows[i][j];
        int p2 = dfs(cows,i+1,j+1) + cows[i][j];
        f[i][j] = min(p1,p2);
        return f[i][j];
    }
    int minimumTotal(vector<vector<int> >& cows) {
        memset(f, -1, sizeof f);
        return dfs(cows,0,0);
    }
};
#include <climits>
#include <cstring>
class Solution {
public:
    int f[2010][2010];
    int w[2010][2010];
    int minimumTotal(vector<vector<int> >& cows) {
        int n = cows.size();
        for(int i = 1;i <= n; i++)
            for(int j = 1;j<=i;j++)
                w[i][j] = cows[i-1][j-1];    
        for (int i = 0; i <= n; i ++ )
            for (int j = 0; j <= i + 1; j ++ )
                f[i][j] = 1e9;
        f[1][1] = w[1][1];     
        for(int i = 2;i <= n; i++)
            for(int j = 1;j<=i;j++)
                f[i][j] = min(f[i-1][j],f[i-1][j-1]) + w[i][j];
        int res = 1e9;
        for(int i = 1;i <= n; i++) res = min(res,f[n][i]);
        return res;
    }
};

全部评论

相关推荐

醒工硬件:1学校那里把xxxxx学院去了,加了学院看着就不像本校 2简历实习和项目稍微精简一下。字太多,面试官看着累 3第一个实习格式和第二个实习不一样。建议换行 4项目描述太详细了,你快把原理图贴上来了。比如可以这样描述:使用yyyy芯片,使用xx拓扑,使用pwm控制频率与占空比,进行了了mos/电感/变压器选型,实现了xx功能 建议把技术栈和你做的较为有亮点的工作归纳出来 5熟悉正反激这个是真的吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务